2011-11-06 12 views
28

Nella mia app per Android, desidero chiedere all'utente in qualche momento di valutare l'app nel mercato Android.Richiedi all'utente di valutare un'app per Android all'interno dell'App

Dopo aver cercato un approccio, ho trovato del codice on this website. Questo codice sembra funzionare molto bene.

Ma sfortunatamente, questo codice sembra sollevare un messaggio di errore "Chiudi forzata" quando il mercato Android non è installato sul telefono dell'utente. C'è un modo per verificare se il mercato Android è installato e, in caso contrario, non provare a eseguire il codice?

La linea che solleva l'errore è probabilmente questo dato che non è in grado di analizzare l'URI:

mContext.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + APP_PNAME))); 

E, a proposito, ci sono altre cose che potrebbero essere migliorate in questo codice?

Edit:

Qualche anno più tardi, ho messo tutto il codice in un piccolo progetto di libreria: AppRater on GitHub

+0

è possibile testare la libreria prima del rilascio della app sul playstore? O deve essere presente nello store per il popup da mostrare? –

+1

@StackDiego Basta ottenere l'ultimo JAR dal progetto GitHub e chiamare 'demo()' invece di 'show()' :) Grazie per il feedback! – caw

+0

Grazie, ho intenzione di provare in questo momento –

risposta

14

si può sempre chiamare getInstalledPackages() dalla classe PackageManager e controllare assicurarsi che la classe di mercato sia installata. Puoi anche usare queryIntentActivities() per assicurarti che l'Intento che costruisci possa essere gestito da qualcosa, anche se non è l'applicazione di mercato. Questa è probabilmente la cosa migliore da fare perché è la più flessibile e robusta.

+0

Grazie! Questo è esattamente quello che stavo cercando :) – caw

0

Se l'applicazione è stata scaricata attraverso Android Market, gli utenti avranno installato Android Market al telefono, quindi non vedo questo come un problema. Sembra molto strano ...

È possibile utilizzare il seguente per lanciare Android Market a pagina dell'applicazione, è un po 'più automatizzato:

Intent i = new Intent(Intent.ACTION_VIEW); 
i.setData(Uri.parse("market://details?id=" + getPackageName())); 
startActivity(i); 
+0

Il codice che hai postato funziona, ma il codice mostrato nel link sopra è più breve - solo una riga per iniziare l'intento. E: naturalmente, c'è la possibilità che gli utenti non abbiano l'app del mercato Android: scaricano la mia app sul mercato Android e poi (a un certo momento) rimuovono l'app del mercato Android dal loro telefono;) – caw

+0

Perché mai avrebbero mai avuto vuoi farlo? Sembra incredibilmente stupido. Sicuramente non è qualcosa di cui uno sviluppatore dovrebbe preoccuparsi. Ma se insisti, puoi fare quello che Kurtis sta suggerendo. Controlla se l'applicazione è installata. Puoi anche effettuare le seguenti operazioni: http://stackoverflow.com/questions/4439043/questo-è-il-pacchetto-nome-del-android-market-or-google-apps e controlla se restituisce un'applicazione. –

+1

Grazie. Potrebbe essere "stupido" ma possibile, tuttavia. Il metodo getPackageName() è un buon modo per evitare di codificare il nome del pacchetto. Ma dal momento che la classe (vedi link) si trova in una classe esterna, non posso usarla. – caw

1

Non tutti i dispositivi Android utilizzano il mercato delle app. Kindle e Nook hanno il loro marketplace quindi la necessità di un codice per verificare se il mercato esiste o meno è buono. Anche se ci dovrebbe essere un modo per inviare la valutazione al mercato corretto, non importa quale sia. Qualcosa da esaminare.

+1

Questo non è davvero un problema comunque, considerando che i mercati Nook e Amazon hanno un processo di sottomissione in cui questi collegamenti sono sempre controllati. Non accederai mai a un'app accettata per essere pubblicata in uno di questi mercati con un link rate a google, quindi la chiusura forzata non sarebbe un problema, dovresti rifare il codice tariffario specifico per il mercato. –

36

Qui è tutto il codice necessario, (un agglomerato di Kurt risposta e le informazioni dedotto, più il legame e la questione):

/* This code assumes you are inside an activity */ 
final Uri uri = Uri.parse("market://details?id=" + getApplicationContext().getPackageName()); 
final Intent rateAppIntent = new Intent(Intent.ACTION_VIEW, uri); 

if (getPackageManager().queryIntentActivities(rateAppIntent, 0).size() > 0) 
{ 
    startActivity(rateAppIntent); 
} 
else 
{ 
    /* handle your error case: the device has no way to handle market urls */ 
} 
+0

Perfetto :-) Mi è piaciuto molto l'approccio. Funzionerà quando l'app verrà rilasciata nel negozio – Nabin

9

Si potrebbe anche usare RateMeMaybe: https://github.com/Kopfgeldjaeger/RateMeMaybe

ti dà alcune opzioni da configurare (minimo di giorni/lanci fino al primo prompt, minimo di giorni/lanci fino a ogni successivo prompt se l'utente sceglie "non ora", titolo della finestra di dialogo, messaggio ecc.). È anche facile da usare.

Esempio di utilizzo da README:

RateMeMaybe rmm = new RateMeMaybe(this); 
rmm.setPromptMinimums(10, 14, 10, 30); 
rmm.setDialogMessage("You really seem to like this app, " 
       +"since you have already used it %totalLaunchCount% times! " 
       +"It would be great if you took a moment to rate it."); 
rmm.setDialogTitle("Rate this app"); 
rmm.setPositiveBtn("Yeeha!"); 
rmm.run(); 
+1

Diciamo che se eseguo codice in onCreate della mia prima attività, visualizzerà mai la finestra di dialogo all'utente? Perché ogni volta che chiamo il metodo RateMe, posso visualizzare la finestra di dialogo dopo 14 giorni. Destra? – keen

0

Quando uso "di mercato: // dettagli id ​​=?" + GetApplicationContext() getPackageName() si apre mercato mobogenie su di me, quindi io preferisco usare https://play.google.com/store/apps/details?id=. "+ getApplicationContext(). getPackageName()

+0

Significa solo che il tuo marketplace alternativo dice che può gestire anche URL 'market: //'. E probabilmente hai scelto questa app come predefinita sul tuo telefono allora. – caw

+0

hm potrebbe essere, ho provato su emulatore. –

1

Questo semplice codice ottenere quello che vuoi, senza bisogno di librerie esterne o nulla di fantasia. Basta metterlo sull'evento OnCreate sulla tua attività principale. La variabile RunEvery determinerà la frequenza con cui apparirà il messaggio di velocità. Nell'esempio è impostato su 10.

// Count times app has been opened, display rating message after number of times 
// By Rafael Duval 
    try { 

     // Get the app's shared preferences 
     SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(this); 

     // Get the value for the run counter 
     int counter = app_preferences.getInt("counter", 0); 

     // Do every x times 
     int RunEvery = 10; 

     if(counter != 0 && counter % RunEvery == 0) 
     { 
      //Toast.makeText(this, "This app has been started " + counter + " times.", Toast.LENGTH_SHORT).show(); 

      AlertDialog.Builder alert = new AlertDialog.Builder(
        MyActivity.this); 
        alert.setTitle("Please rate"); 
        alert.setIcon(R.drawable.ic_launcher); //app icon here 
        alert.setMessage("Thanks for using this free app. Please take a moment to rate it."); 

        alert.setPositiveButton("Cancel", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, 
         int whichButton) {        
          //Do nothing 
         } 
        }); 

        alert.setNegativeButton("Rate it", 
        new DialogInterface.OnClickListener() { 

         public void onClick(DialogInterface dialog, int which) { 

          final String appName = getApplicationContext().getPackageName(); 
          try { 
          startActivity(new Intent(Intent.ACTION_VIEW, 
           Uri.parse("market://details?id=" 
           + appName))); 
          } catch (android.content.ActivityNotFoundException anfe) { 
          startActivity(new Intent(
           Intent.ACTION_VIEW, 
           Uri.parse("http://play.google.com/store/apps/details?id=" 
           + appName))); 
          } 

         } 
        }); 
        alert.show();    
     } 


     // Increment the counter 
     SharedPreferences.Editor editor = app_preferences.edit(); 
     editor.putInt("counter", ++counter); 
     editor.commit(); // Very important   

    } catch (Exception e) { 
     //Do nothing, don't run but don't break 
    }   
5

Per prima cosa è necessario contare i tempi di applicazione utilizzati;

SharedPreferences preferences = getSharedPreferences("progress", MODE_PRIVATE); 
int appUsedCount = preferences.getInt("appUsedCount",0); 
appUsedCount++; 
SharedPreferences.Editor editor = preferences.edit(); 
editor.putInt("appUsedCount", appUsedCount); 
editor.apply(); 

if (appUsedCount==10 || appUsedCount==50 || appUsedCount==100 || appUsedCount==200 || appUsedCount==300){ 
    AskForRating(appUsedCount); 
} else { 
    finish(); 
} 

Rispondere a quanto richiesto;

private void AskForRating(int _appUsedCount){ 

    AlertDialog.Builder alert = new AlertDialog.Builder(this); 
    alert.setTitle("Please Rate Us"); 
    alert.setIcon(R.drawable.book); 
    alert.setMessage("Thanks for using the application. If you like YOUR APP NAME please rate us! Your feedback is important for us!"); 
    alert.setPositiveButton("Rate it",new Dialog.OnClickListener(){ 
     public void onClick(DialogInterface dialog, int whichButton){ 
      String url = "https://play.google.com/store/apps/details?id=YOUR PACKAGE NAME"; 
      Intent i = new Intent(Intent.ACTION_VIEW); 
      i.setData(Uri.parse(url)); 
      startActivity(i); 
     } 
    }); 
    alert.setNegativeButton("Not now", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      finish(); 
     } 
    }); 
    alert.show(); 
} 
+0

La differenza qui è che ti porterà al sito web attraverso un browser invece di usare l'app Play Store. Per prima cosa è necessario verificare che non sia possibile utilizzare l'app Play Store, quindi utilizzare il browser per accedere al sito Web. – xxx

0

uso di questo codice

Uri uri = Uri.parse("market://details?id=" + context.getPackageName()); 
Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri); 
// To count with Play market backstack, After pressing back button, 
// to taken back to our application, we need to add following flags to intent. 
goToMarket.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | 
       Intent.FLAG_ACTIVITY_NEW_DOCUMENT | 
       Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 
try { 
    startActivity(goToMarket); 
} catch (ActivityNotFoundException e) { 
    startActivity(new Intent(Intent.ACTION_VIEW, 
      Uri.parse("http://play.google.com/store/apps/details?id=" + context.getPackageName()))); 
}