Link "Avalie este aplicativo" no aplicativo da loja Google Play no telefone

266

Gostaria de colocar um link "Classificar este aplicativo" em um aplicativo Android para abrir a listagem de aplicativos no aplicativo da loja do Google Play do usuário em seu telefone.

  1. Qual código eu tenho que escrever para criar o link market://ou- http://aberto no aplicativo da loja Google Play no telefone?
  2. Onde você coloca o código?
  3. Alguém tem uma implementação de exemplo disso?
  4. Você precisa especificar a tela onde o link market://ou http://será colocado e qual é o melhor para usar - market://ou http://?
Adreno
fonte
Isso tem tudo o que você precisa: github.com/delight-im/AppRater E você pode procurar o código-fonte para entender como isso é feito.
caw 03/03

Respostas:

555

Abro a Play Store no meu aplicativo com o seguinte código:

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

Isso iniciará a Play Store com sua página do aplicativo já aberta. O usuário pode classificá-lo lá.

miguel.rodelas
fonte
2
Onde no androidmanifest.xml eu coloco esse código? Preciso adicionar mais alguma coisa? Como isso corresponde a um link ou botão real em uma tela que o usuário pressiona? Obrigado
Adreno
1
Você não precisa adicionar nenhum código ao manifesto. Você só precisa colocar esse código no OnClickListener do seu botão / link; portanto, quando o botão é clicado, o código é executado e a Play Store é iniciada.
Miguel.rodelas
61
Esta solução não conta com o backstack do mercado Play. Depois de pressionar o botão Voltar, você não será levado de volta ao seu aplicativo. Se desejar, inclua esta linha: 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: Essa constante foi descontinuada no nível 21. da API. A partir da API 21, ela é executada de forma idêntica ao FLAG_ACTIVITY_NEW_DOCUMENT, que deve ser usado em vez disso.
Xnagyg
1
Ao chamar de uma classe java que não é de atividade, você precisa passar o contexto como context.startActivity (goToMarket);
DMur 12/01
47

Aqui está um código funcional e atualizado :)

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

Coloque o código no qual Activityvocê deseja chamá-lo.
Quando o usuário clica em um botão para avaliar o aplicativo, basta chamar a rateApp()função.

György Benedek
fonte
Qual pacote NuGet devo adicionar e qual namespace devo ser usingpara Intentser um tipo viável? Encontrei o Android.Content , mas estou perdendo Intentno Xamarin Forms.
s3c 8/01
24

Eu sempre uso este código:

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=PackageName")));
Cabezas
fonte
4
Sempre gostei de um liners. :)
androidStud
Eu uso-o, mas ele mostra este erro- `android.content.ActivityNotFoundException: Nenhuma atividade encontrada para manipular Intent {act = android.intent.action.VIEW dat = market: // details? id = PackageName}` - o que posso fazer ?
Mina Dahesh
Você pode verificar isso ?
Cabezas
@Cabezas. Geralmente eu quero mostrar todo o mercado existente no telefone. ao clicar em qual deles, se meu aplicativo existia, o mercado mostra o aplicativo. Então, o que devo fazer?
Mina Dahesh
1
@Cabezas. eu uso este código: `try {Intent intent = new Intent (Intent.ACTION_VIEW); intent.setData (Uri.parse ("bazar: // detalhes? id = vow_note.maxsoft.com.vownote")); intent.setData (Uri.parse ("myket: // comentário? id = vow_note.maxsoft.com.vownote")); startActivity (intenção); } catch (ActivityNotFoundException e1) {try {startActivity (nova Intenção (Intent.ACTION_VIEW, Uri.parse ("MARKET URL")))); startActivity (nova Intent (Intent.ACTION_VIEW, Uri.parse ("MARKET URL"))); } catch (ActivityNotFoundException e2) {Toast.} `
Mina Dahesh
18

Isso se você publicar seu aplicativo na Google Play Store e na Amazon Appstore. Também lido com o caso de que os usuários (especialmente na China) não têm loja de aplicativos e navegador.

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();
        }
    }
}
Hải Phong
fonte
Não responde à pergunta em questão.
e o código para abrir a listagem da Amazon App Store do seu aplicativo?
precisa saber é o seguinte
Qual pacote NuGet devo adicionar e qual namespace devo ser usingpara Intentser um tipo viável? Encontrei o Android.Content , mas estou perdendo Intentno Xamarin Forms.
s3c 8/01
10

Você sempre pode chamar getInstalledPackages () da classe PackageManager e verificar se a classe de mercado está instalada. Você também pode usar queryIntentActivities () para garantir que o Intent que você constrói possa ser tratado por algo, mesmo que não seja o aplicativo de mercado. Esta é provavelmente a melhor coisa a fazer, na verdade, porque é a mais flexível e robusta.

Você pode verificar se o aplicativo de mercado está lá

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 a lista tiver pelo menos uma entrada, o mercado estará lá.

Você pode usar o seguinte para iniciar o Android Market na página do aplicativo, é um pouco mais automatizado:

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

Se você quiser testar isso em seu emulador, provavelmente não possui o mercado instalado: consulte estes links para obter mais detalhes:

Como ativar o Android Market no emulador do Google Android

Instalando o Google Play no emulador Android

K_Anas
fonte
Onde no androidmanifest.xml eu coloco esse código? Preciso adicionar mais alguma coisa? Como isso corresponde a um link ou botão real em uma tela que o usuário pressiona? Obrigado
Adreno
8

Eu uso essa abordagem para fazer com que o usuário avalie meus aplicativos:

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();
}
gtgray
fonte
O que é isso? - market://details?id=Meu link do aplicativo é comohttps:\\play.google.com\apps\details?id=
Sagar Balyan 11/17
2
@SagarBalyan, é um uri especial para abrir a página do aplicativo no aplicativo do Google Play Market. Se você começar a atividade com link fornecido android abrirá sua página aplicativo no navegador padrão ou lhe dará uma escolha o aplicativo navegador para começar
gtgray
5

Uma versão 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)
    }
}
kuzdu
fonte
4

Você pode usar isso, funciona para mim

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

Classificação da Play Store

 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())));
                }
            }
        });
Keshav Gera
fonte
3

Outra abordagem que pode funcionar para você é o Linkify. Se eu tiver um TextView que solicite ao usuário que avalie o aplicativo, posso vincular algumas palavras no texto para que sejam destacadas e, quando o usuário as tocar, a loja de jogos abrirá, pronta para sua revisão:

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());
Garnet Ulrich
fonte
3

Um ponto sobre todas as respostas que têm implementações baseadas na estratégia getPackageName () é que o uso de BuildConfig.APPLICATION_ID pode ser mais direto e funciona bem se você usar a mesma base de código para criar vários aplicativos com diferentes IDs de aplicativos (por exemplo, um produto de etiqueta branca).

hecht
fonte
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 é o nome da conta de desenvolvedor na Play Store

Pratik Saluja
fonte
2

Você pode usar esse código simples para classificar seu aplicativo em sua atividade.

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())));
}
SANJAY GUPTA
fonte
O que é isso? - market://details?id=Meu link do aplicativo é comohttps:\\play.google.com\apps\details?id=
Sagar Balyan
@SagarBalyan Se o usuário tiver vários mercados de aplicativos, ele abrirá a loja padrão ou mostrará a intenção de todas as lojas disponíveis.
Avi Parshan
2

Utilizo a seguinte abordagem combinando esta e esta resposta sem usar a programação baseada em exceções e também suporta o sinalizador de intenção pré-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());

Como o sinalizador de intenção FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESETfoi descontinuado da API 21, uso a @SuppressWarnings("deprecation")tag no método getRateIntent porque meu SDK de destino do aplicativo está abaixo da API 21.


Também tentei a maneira oficial do Google sugerida em seu site (6 de dezembro de 2019). Para o que eu vejo, não lida com o caso se o aplicativo Play Store não estiver instalado:

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);
Bruno Bieri
fonte
0

Declare um método na sua classe de atividade. Em seguida, copie e cole o código abaixo.

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

}

Agora chame esse método de qualquer lugar do seu código.

Siga a imagem abaixo do meu projeto prático.

insira a descrição da imagem aqui

XpressGeek
fonte