2011-11-06 13 views
28

W mojej aplikacji na Androida chcę poprosić użytkownika w pewnym momencie o ocenę aplikacji na rynku Android.Pytaj użytkownika o ocenę aplikacji na Androida w aplikacji

Po wyszukaniu podejścia znalazłem kod on this website. Ten kod wydaje się działać bardzo dobrze.

Niestety, ten kod wydaje się powodować komunikat o błędzie "Wymuszone zamknięcie", gdy rynek Android nie jest zainstalowany na telefonie użytkownika. Czy istnieje sposób sprawdzenia, czy rynek Android jest zainstalowany, a jeśli nie, nie próbuj wykonać kodu?

Linia co podnosi błąd jest chyba ten jeden, ponieważ nie można analizować URI:

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

A przy okazji, czy są jakieś inne rzeczy, które można poprawić w tym kodzie?

Edit:

Kilka lat później, mam umieścić cały kod do małego projektu Biblioteka: AppRater on GitHub

+0

to możliwe, aby przetestować swoją bibliotekę przed wydaniem aplikacji na playstore? Lub musi być obecny w sklepie, aby było wyświetlane popup? –

+1

@StackDiego Po prostu pobierz najnowsze JAR z projektu GitHub i wywołaj 'demo()' zamiast 'show()' :) Dzięki za informację zwrotną! – caw

+0

Dziękuję, mam zamiar spróbować teraz –

Odpowiedz

14

Zawsze można zadzwonić getInstalledPackages() z klasy PackageManager i sprawdź upewnij się, że klasa rynku jest zainstalowana. Możesz także użyć queryIntentActivities(), aby upewnić się, że intencja, którą zbudujesz, będzie mogła być obsługiwana przez coś, nawet jeśli nie jest to aplikacja rynkowa. Jest to prawdopodobnie najlepsza rzecz do zrobienia, ponieważ jest najbardziej elastyczna i wytrzymała.

+0

Dziękujemy! Właśnie tego szukałem :) – caw

0

Jeśli aplikacja została pobrana poprzez Android Market, użytkownicy będą mieć zainstalowany Android Market przez telefon, więc naprawdę nie uważam tego za problem. Wydaje się bardzo dziwne ...

można użyć następujących czynności, aby uruchomić Android Market na stronie Twojej aplikacji, jest to trochę bardziej zautomatyzowane:

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

Kod, który wysłałeś działa, ale kod pokazany w powyższym linku jest krótszy - tylko jedna linia, aby rozpocząć intencję. I: Oczywiście istnieje możliwość, że użytkownicy nie mają aplikacji Android Market: pobierają moją aplikację przez rynek Android, a następnie (w pewnym czasie) usuwają aplikację Android Market ze swojego telefonu;) – caw

+0

Dlaczego, na litość boską, mieliby kiedykolwiek chcesz to zrobić? Wydaje się to niewiarygodnie głupie. Zdecydowanie nie jest to coś, o czym powinien się troszczyć deweloper. Ale jeśli nalegasz, możesz zrobić to, co sugeruje Kurtis. Sprawdź, czy aplikacja jest zainstalowana. Możesz również wykonać następujące czynności: http://stackoverflow.com/questions/4439043/what-is-the-package-of-the-android-market-or-google-apps i sprawdź, czy zwraca aplikację. –

+1

Dziękuję. Może to być "głupie", ale możliwe. Metoda getPackageName() to dobry sposób na uniknięcie twardego kodowania nazwy pakietu. Ale ponieważ klasa (patrz link) jest w klasie zewnętrznej, nie mogę jej użyć. – caw

1

Nie wszystkie urządzenia z systemem Android korzystają z rynku aplikacji. Kindle i Nook mają swój własny rynek, więc potrzeba kodu, aby sprawdzić, czy rynek istnieje, jest dobry. Chociaż powinien istnieć sposób przesłania oceny do właściwego rynku, bez względu na to, który z nich jest. Coś do zaglądnięcia.

+1

To nie jest tak naprawdę problem, biorąc pod uwagę, że rynki Nook i Amazon mają proces składania zgłoszeń, w którym te linki są zawsze sprawdzane. Nigdy nie uzyskasz zgody na publikację aplikacji na żadnym z tych rynków z linkiem do witryny w google, więc zamknięcie uprawnień nie będzie stanowić problemu, musisz zmienić kod stawki właściwy dla rynku. –

36

Oto cały kod trzeba (konglomerat Kurt odpowiedź i implikowana informacja, plus link i pytanie):

/* 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

Perfect :-) Uwielbiałem podejście. To zadziała, gdy aplikacja zostanie wydana w sklepie – Nabin

9

Można również użyć RateMeMaybe: https://github.com/Kopfgeldjaeger/RateMeMaybe

to daje całkiem sporo opcji do skonfigurowania (minimum dni/uruchamia się do pierwszego polecenia, minimum dni/uruchamia się do następnego monitu, jeśli użytkownik wybierze "nie teraz", tytuł okna, wiadomość itp.). Jest również łatwy w użyciu.

Przykład użycia z 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

Powiedzmy, że jeśli wykonam kod w onCreate mojej pierwszej aktywności, czy kiedykolwiek wyświetli się okno dialogowe dla użytkownika? Ponieważ za każdym razem wzywam metodę RateMeMaybe, która wyświetla okno dialogowe po 14 dniach. Dobrze? – keen

0

Gdy używam "Rynek: // szczegóły id =" + getApplicationContext() getPackageName() otwiera rynek mobogenie na mnie, więc wolę używać https://play.google.com/store/apps/details?id=. "+ getApplicationContext(). getPackageName()

+0

To oznacza tylko, że twój alternatywny rynek mówi, że może obsłużyć adresy URL 'market: // '. I prawdopodobnie wybrałeś tę aplikację jako domyślną w swoim telefonie. – caw

+0

hm może być, próbowałem go na emulatorze. –

1

Ten prosty kod będzie osiągnąć to, co chcesz, nie ma potrzeby zewnętrznych bibliotek lub niczego wyjątkowego. Po prostu umieść go w wydarzeniu OnCreate na głównej aktywności. Zmienna RunEvery określa, jak często będzie wyświetlana wiadomość o kursie. W tym przykładzie jest ustawiony na 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

Najpierw musisz policzyć czas użycia aplikacji;

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(); 
} 

Niż możesz tak podpowiadać;

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

Różnica polega na tym, że przeniesie Cię do witryny za pomocą przeglądarki zamiast do aplikacji Sklep Play. Najpierw sprawdź, czy korzystanie z aplikacji Sklep Play nie jest możliwe, a następnie skorzystaj z przeglądarki, aby przejść do witryny. – xxx

0

użyć tego kodu

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()))); 
} 
Powiązane problemy