Link "Valuta questa app" nell'app Google Play Store sul telefono


266

Vorrei inserire un link "Valuta questa app" in un'app Android per aprire la lista delle app nell'app Google Play Store dell'utente sul proprio telefono.

  1. Quale codice devo scrivere per creare il collegamento market://o http://-link aperto nell'app Google Play Store sul telefono?
  2. Dove metti il ​​codice?
  3. Qualcuno ha un'implementazione di esempio di questo?
  4. Devi specificare la schermata in cui verrà posizionato il link market://o http://e qual è il migliore da usare - market://o http://?

Questo ha tutto ciò di cui hai bisogno: github.com/delight-im/AppRater E puoi cercare il codice sorgente per capire come è fatto.
Caw

Risposte:


555

Apro il Play Store dalla mia app con il seguente 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())));
    }

Questo avvierà il Play Store con la pagina dell'app già aperta. L'utente può valutarlo lì.


2
Dove in androidmanifest.xml inserisco questo codice? Devo aggiungere qualcos'altro? In che modo corrisponde a un link o pulsante effettivo su una schermata che l'utente preme? Grazie
Adreno

1
Non è necessario aggiungere alcun codice al manifest. Devi solo inserire questo codice all'interno di OnClickListener del tuo pulsante / link, quindi quando fai clic sul pulsante, il codice viene eseguito e viene avviato Play Store.
miguel.rodelas,

61
Questa soluzione non conta con il backstack del mercato Play. Dopo aver premuto il pulsante Indietro, non si torna alla propria applicazione. Se lo desideri, aggiungi questa riga: intent.addFlags (Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
Jan Muller,

24
Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET: questa costante è stata dichiarata obsoleta nel livello API 21. A partire dall'API 21 ciò si comporta in modo identico a FLAG_ACTIVITY_NEW_DOCUMENT che dovrebbe essere utilizzato al posto di questo.
xnagyg,

1
Se si chiama da una classe Java non Activity è necessario passare il contesto come context.startActivity (goToMarket);
DMur

47

Ecco un codice funzionante e aggiornato :)

/*
* Start with rating the app
* Determine if the Play Store is installed on the device
*
* */
public void rateApp()
{
    try
    {
        Intent rateIntent = rateIntentForUrl("market://details");
        startActivity(rateIntent);
    }
    catch (ActivityNotFoundException e)
    {
        Intent rateIntent = rateIntentForUrl("https://play.google.com/store/apps/details");
        startActivity(rateIntent);
    }
}

private Intent rateIntentForUrl(String url)
{
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(String.format("%s?id=%s", url, getPackageName())));
    int flags = Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
    if (Build.VERSION.SDK_INT >= 21)
    {
        flags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
    }
    else
    {
        //noinspection deprecation
        flags |= Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
    }
    intent.addFlags(flags);
    return intent;
}

Inserisci il codice nel quale Activitydesideri chiamarlo.
Quando l'utente fa clic su un pulsante per valutare l'app, basta chiamare la rateApp()funzione.


Quale pacchetto NuGet dovrei aggiungere e quale spazio dei nomi dovrei essere usingper Intentessere un tipo praticabile? Ho trovato Android.Content , ma sono in perdita con IntentXamarin Forms.
s3c,

24

Uso sempre questo codice:

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

4
Sempre come una
fodera

lo uso ma mostra questo errore- `android.content.ActivityNotFoundException: nessuna attività trovata per gestire l'intento {act = android.intent.action.VIEW dat = market: // details? id = PackageName}` - cosa posso fare ?
Mina Dahesh,

Puoi controllare questo ?
Cabezas,

@Cabezas. generalmente voglio mostrare tutto il mercato esistente al telefono. facendo clic su quale di essi, se esisteva la mia app, market mostra l'app. Quindi cosa dovrei fare?
Mina Dahesh,

1
@Cabezas. io uso questo codice: `try {Intent intent = new Intent (Intent.ACTION_VIEW); intent.setData (Uri.parse ( "bazar: // dettagli id = vow_note.maxsoft.com.vownote?")); intent.setData (Uri.parse ( "myket: // commento id = vow_note.maxsoft.com.vownote")); startActivity (intento); } catch (ActivityNotFoundException e1) {try {startActivity (new Intent (Intent.ACTION_VIEW, Uri.parse ("URL MERCATO"))); startActivity (nuovo intento (Intent.ACTION_VIEW, Uri.parse ("URL MERCATO"))); } catch (ActivityNotFoundException e2) {Toast.} `
Mina Dahesh

18

Questo se pubblichi la tua app sia su Google Play Store che su Amazon Appstore. Gestisco anche il caso in cui gli utenti (soprattutto in Cina) non dispongano sia dell'app store che del browser.

public void goToMyApp(boolean googlePlay) {//true if Google Play, false if Amazone Store
    try {
       startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse((googlePlay ? "market://details?id=" : "amzn://apps/android?p=") +getPackageName())));
    } catch (ActivityNotFoundException e1) {
        try {
            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse((googlePlay ? "http://play.google.com/store/apps/details?id=" : "http://www.amazon.com/gp/mas/dl/android?p=") +getPackageName())));
        } catch (ActivityNotFoundException e2) {
            Toast.makeText(this, "You don't have any app that can open this link", Toast.LENGTH_SHORT).show();
        }
    }
}

Non risponde alla domanda a portata di mano.

che dire del codice per aprire l'elenco di app store amazon della tua app?
isJulian00

Quale pacchetto NuGet dovrei aggiungere e quale spazio dei nomi dovrei essere usingper Intentessere un tipo praticabile? Ho trovato Android.Content , ma sono in perdita con IntentXamarin Forms.
s3c,

10

È sempre possibile chiamare getInstalledPackages () dalla classe PackageManager e verificare che la classe di mercato sia installata. Puoi anche utilizzare 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 in realtà perché è la più flessibile e robusta.

Puoi controllare se l'app di mercato è presente

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://search?q=foo"));
PackageManager pm = getPackageManager();
List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);

Se l'elenco contiene almeno una voce, il mercato è lì.

Puoi utilizzare quanto segue per avviare Android Market sulla pagina della tua applicazione, è un po 'più automatizzata:

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

Se vuoi testarlo sul tuo emulatore probabilmente non hai installato il mercato su di esso: vedi questi link per maggiori dettagli:

Come abilitare Android Market nell'emulatore Android di Google

Installazione di Google Play sull'emulatore Android


Dove in androidmanifest.xml inserisco questo codice? Devo aggiungere qualcos'altro? In che modo corrisponde a un link o pulsante effettivo su una schermata che l'utente preme? Grazie
Adreno

8

Uso questo approccio per valutare gli utenti delle mie app:

public static void showRateDialog(final Context context) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context)
            .setTitle("Rate application")
            .setMessage("Please, rate the app at PlayMarket")
            .setPositiveButton("RATE", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (context != null) {
                        String link = "market://details?id=";
                        try {
                            // play market available
                            context.getPackageManager()
                                    .getPackageInfo("com.android.vending", 0);
                        // not available
                        } catch (PackageManager.NameNotFoundException e) {
                            e.printStackTrace();
                            // should use browser
                            link = "https://play.google.com/store/apps/details?id=";
                        }
                        // starts external action
                        context.startActivity(new Intent(Intent.ACTION_VIEW, 
                                Uri.parse(link + context.getPackageName())));
                    }
                }
            })
            .setNegativeButton("CANCEL", null);
    builder.show();
}

A cosa serve questo? - market://details?id=Il link della mia app è simile:https:\\play.google.com\apps\details?id=
Sagar Balyan,

2
@SagarBalyan, è un uri speciale per l'apertura della tua pagina dell'app nell'applicazione Google Play Market. Se avvii l'attività con il link che hai fornito, Android aprirà la pagina dell'app nel browser predefinito o ti darà la scelta sull'app del browser da avviare
gtgray,

5

Una versione di Kotlin

fun openAppInPlayStore() {
    val uri = Uri.parse("market://details?id=" + context.packageName)
    val goToMarketIntent = Intent(Intent.ACTION_VIEW, uri)

    var flags = Intent.FLAG_ACTIVITY_NO_HISTORY or Intent.FLAG_ACTIVITY_MULTIPLE_TASK
    flags = if (Build.VERSION.SDK_INT >= 21) {
        flags or Intent.FLAG_ACTIVITY_NEW_DOCUMENT
    } else {
        flags or Intent.FLAG_ACTIVITY_CLEAR_TASK
    }
    goToMarketIntent.addFlags(flags)

    try {
        startActivity(context, goToMarketIntent, null)
    } catch (e: ActivityNotFoundException) {
        val intent = Intent(Intent.ACTION_VIEW,
                Uri.parse("http://play.google.com/store/apps/details?id=" + context.packageName))

        startActivity(context, intent, null)
    }
}

4

Puoi usarlo, funziona per me

public static void showRateDialogForRate(final Context context) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context)
            .setTitle("Rate application")
            .setMessage("Please, rate the app at PlayMarket")
            .setPositiveButton("RATE", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (context != null) {
                        ////////////////////////////////
                        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_CLEAR_WHEN_TASK_RESET |
                                Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
                        try {
                            context.startActivity(goToMarket);
                        } catch (ActivityNotFoundException e) {
                            context.startActivity(new Intent(Intent.ACTION_VIEW,
                                    Uri.parse("http://play.google.com/store/apps/details?id=" + context.getPackageName())));
                        }


                    }
                }
            })
            .setNegativeButton("CANCEL", null);
    builder.show();
}

4

Play Store Rating

 btn_rate_us.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Uri uri = Uri.parse("market://details?id=" + 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=" + getPackageName())));
                }
            }
        });

3

Un altro approccio che potrebbe funzionare per te è Linkify. Se ho un TextView che chiede all'utente di valutare l'app, posso collegare un paio di parole nel testo in modo che siano evidenziate e quando l'utente le tocca, si apre il Play Store, pronto per la loro recensione:

class playTransformFilter implements TransformFilter {
   public String transformUrl(Matcher match, String url) {
        return "market://details?id=com.qwertyasd.yourapp";
   }
}

class playMatchFilter implements MatchFilter {
    public boolean acceptMatch(CharSequence s, int start, int end) {
        return true;
    }
}
text1 = (TextView) findViewById(R.id.text1);
text1.setText("Please rate it.");
final Pattern playMatcher = Pattern.compile("rate it");
Linkify.addLinks(text1, playMatcher, "", 
                   new playMatchFilter(), new playTransformFilter());

3

Un punto relativo a tutte le risposte che hanno implementazioni basate sulla strategia getPackageName () è che l'utilizzo di BuildConfig.APPLICATION_ID può essere più semplice e funziona bene se si utilizza la stessa base di codice per creare più app con ID app diversi (ad esempio, un prodotto con etichetta bianca).


2
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.support.annotation.StringRes;
import android.widget.Toast;

public class PlayStoreLink {

public void checkForUpdate(Context context, int applicationId) 
{
    try {
        context.startActivity(new Intent(Intent.ACTION_VIEW,
                Uri.parse(context.getString(R.string.url_market_details)
                        + applicationId)));
    } catch (android.content.ActivityNotFoundException anfe) {
        try {
            context.startActivity(new Intent(Intent.ACTION_VIEW,
                    Uri.parse(context.getString(R.string.url_playstore_app)
                            + applicationId)));
        } catch (Exception e) {
            Toast.makeText(context,
                    R.string.install_google_play_store,
                    Toast.LENGTH_SHORT).show();
        }
    }
}

public void moreApps(Context context, @StringRes int devName) {
    try {
        context.startActivity(new Intent(Intent.ACTION_VIEW,
                Uri.parse(context.getString(R.string.url_market_search_app)
                        + context.getString(devName))));
    } catch (android.content.ActivityNotFoundException anfe) {
        try {
            context.startActivity(new Intent(Intent.ACTION_VIEW,
                    Uri.parse(context.getString(R.string.url_playstore_search_app)
                            + context.getString(devName))));
        } catch (Exception e) {
            Toast.makeText(context,
                    R.string.install_google_play_store,
                    Toast.LENGTH_SHORT).show();
        }
    }
}

public void rateApp(Context context, int applicationId) {
    try {
        Uri uri = Uri.parse(context.getString(R.string.url_market_details)
                + applicationId);
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        int flags = Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH)
            flags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
        else
            flags |= Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
        intent.addFlags(flags);
        context.startActivity(intent);
    } catch (ActivityNotFoundException e) {
        checkForUpdate(context, applicationId);
    }
}
}

<string name="install_google_play_store" translatable="false">Please install google play store and then try again.</string>
<string name="url_market_details" translatable="false">market://details?id=</string>
<string name="url_playstore_app" translatable="false">https://play.google.com/store/apps/details?id=</string>
<string name="url_market_search_app" translatable="false">market://search?q=pub:</string>
<string name="url_playstore_search_app" translatable="false">http://play.google.com/store/search?q=pub:</string>
<string name="app_link" translatable="false">https://play.google.com/store/apps/details?id=</string>

devName è il nome dell'account sviluppatore sul Play Store


2

Puoi utilizzare questo semplice codice per valutare l'app nella tua attività.

try {
    Uri uri = Uri.parse("market://details?id=" + getPackageName());
    Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(goToMarket);
} catch (ActivityNotFoundException e) {
    startActivity(new Intent(Intent.ACTION_VIEW,
    Uri.parse("http://play.google.com/store/apps/details?id=" + getPackageName())));
}

A cosa serve questo? - market://details?id=Il link della mia app è simile:https:\\play.google.com\apps\details?id=
Sagar Balyan,

@SagarBalyan Se l'utente ha più mercati di app, aprirà il negozio predefinito o mostrerà loro un intento per ogni negozio disponibile.
Avi Parshan,

2

Uso il seguente approccio combinando questa e questa risposta senza utilizzare la programmazione basata su eccezioni e supporta anche il flag di intenti pre-API 21.

@SuppressWarnings("deprecation")
private Intent getRateIntent()
{
  String url        = isMarketAppInstalled() ? "market://details" : "https://play.google.com/store/apps/details";
  Intent rateIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(String.format("%s?id=%s", url, getPackageName())));
  int intentFlags   = Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
  intentFlags      |= Build.VERSION.SDK_INT >= 21 ? Intent.FLAG_ACTIVITY_NEW_DOCUMENT : Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
  rateIntent.addFlags(intentFlags);
  return rateIntent;
}

private boolean isMarketAppInstalled()
{
  Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=anyText"));
  return getPackageManager().queryIntentActivities(marketIntent, 0).size() > 0;
}


// use
startActivity(getRateIntent());

Poiché il flag di intento FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESETè deprecato dall'API 21, utilizzo il @SuppressWarnings("deprecation")tag sul metodo getRateIntent perché l'SDK di destinazione della mia app è inferiore all'API 21.


Ho anche provato il modo ufficiale di Google suggerito sul loro sito Web (6 dicembre 2019). Per quello che vedo non gestisce il caso se l'app Play Store non è installata:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(
    "https://play.google.com/store/apps/details?id=com.example.android"));
intent.setPackage("com.android.vending");
startActivity(intent);

0

Dichiarare un metodo nella classe di attività. Quindi copia e incolla il codice qui sotto.

private void OpenAppInPlayStore(){

    Uri uri = Uri.parse("market://details?id=" + this.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=" + this.getPackageName())));
    }

}

Ora chiama questo metodo da qualsiasi parte del tuo codice.

Segui l'immagine qui sotto dal mio progetto pratico.

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.