Telefondaki Google Play Store uygulamasında "Bu Uygulamayı Oyla" bağlantısı


266

Kullanıcının telefonundaki Google Play Store uygulamasında uygulama listesini açmak için bir Android Uygulamasına bir "Bu Uygulamayı Oyla" bağlantısı koymak istiyorum.

  1. Telefondaki Google Play Store uygulamasında market://veya http://-link'i açmak için hangi kodu yazmam gerekir?
  2. Kodu nereye koyarsınız?
  3. Herkes bunun örnek bir uygulaması var mı?
  4. market://Veya http://bağlantısının nereye yerleştirileceğini ve hangisinin en iyi kullanılacağını - market://veya http://?

İhtiyacınız olan her şeye sahiptir: github.com/delight-im/AppRater Ve nasıl yapıldığını anlamak için kaynak koduna bakabilirsiniz.
Ocak

Yanıtlar:


555

Play Store'u Uygulamamdan aşağıdaki kodla açıyorum:

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

Bu, Uygulama sayfanız zaten açıkken Google Play Store'u başlatır. Kullanıcı bunu derecelendirebilir.


2
Androidmanifest.xml dosyasının neresinde bu kodu yerleştirebilirim? Başka bir şey eklemem gerekiyor mu? Bu, kullanıcının bastığı bir ekranda gerçek bir bağlantıya veya düğmeye nasıl karşılık gelir? Teşekkürler
Adreno

1
Manifest'e herhangi bir kod eklemenize gerek yoktur. Bu kodu sadece düğmenizin / bağlantınızın OnClickListener'ına yerleştirmeniz gerekir, böylece düğme tıklandığında kod yürütülür ve Play Store başlatılır.
miguel.rodelas

61
Bu çözüm Play market backstack için geçerli değildir. Geri düğmesine bastıktan sonra, uygulamanıza geri alınmazsınız. İsterseniz şu satırı ekleyin: 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: Bu sabit API 21 düzeyinde kaldırıldı. API 21'den itibaren bu, bunun yerine kullanılması gereken FLAG_ACTIVITY_NEW_DOCUMENT ile aynı şekilde çalışır.
xnagyg

1
Activity olmayan bir java sınıfından çağrı yapıyorsanız, context.startActivity (goToMarket);
DMur

47

İşte çalışan ve güncel bir kod :)

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

Kodu Activityaramak istediğiniz yere koyun .
Kullanıcı uygulamayı derecelendirmek için bir düğmeyi tıkladığında rateApp()işlevi çağırmanız yeterlidir.


Hangi NuGet Paketini eklemeliyim ve uygun bir tür olabilmek usingiçin hangi ad alanını kullanmalıyım Intent? Android.Content'i buldum , ancak IntentXamarin Forms'da kayboldum.
s3c

24

Ben her zaman bu kodu kullanın:

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

4
Her zaman bir gömlek gibi. :)
androidStud

Ben kullanıyorum ama bu hatayı gösterir- `` android.content.ActivityNotFoundException: Niyeti işlemek için hiçbir etkinlik bulunamadı {act = android.intent.action.VIEW dat = market: // details? id = PackageName} `- ne yapabilirim ?
Mina Dahesh

Sen kontrol edebilir bu ?
Cabezas

@Cabezas. ben tüm telefonda mevcut pazar göstermek istiyorum. Hangisi üzerine tıklanırsa, eğer uygulamam mevcutsa, pazar uygulamayı gösterir. Ne yapmalıyım?
Mina Dahesh

1
@Cabezas. Bu kodu kullanın: `denemek {Niyet niyet = yeni Niyet (Niyet.ACTION_VIEW); intent.setData (Uri.parse ( "pazar: // ayrıntıları id = vow_note.maxsoft.com.vownote?")); intent.setData (Uri.parse ( "myket: // comment id = vow_note.maxsoft.com.vownote")); startActivity (niyet); } catch (ActivityNotFoundException e1) {try {startActivity (new Intent (Intent.ACTION_VIEW, Uri.parse ("MARKET URL"))); startActivity (yeni Niyet (Niyet.ACTION_VIEW, Uri.parse ("MARKET URL"))); } catch (ActivityNotFoundException e2) {Tost.} `
Mina Dahesh

18

Bu, uygulamanızı hem Google Play Store'da hem de Amazon Appstore'da yayınlarsanız olur. Ayrıca, kullanıcıların (özellikle Çin'de) hem uygulama mağazasına hem de tarayıcıya sahip olmamalarını da ele alıyorum.

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

Eldeki soruya cevap vermiyor.

uygulamanızın amazon uygulama mağazası listesini açmak için kod ne olacak?
isJulian00

Hangi NuGet Paketini eklemeliyim ve uygun bir tür olabilmek usingiçin hangi ad alanını kullanmalıyım Intent? Android.Content'i buldum , ancak IntentXamarin Forms'da kayboldum.
s3c

10

Her zaman arayabilirsin getInstalledPackages () den PackageManager sınıf ve emin pazar sınıf yüklü olun. Yaptığınız Niyet'in piyasa uygulaması olmasa bile bir şey tarafından işlenebildiğinden emin olmak için queryIntentActivities () öğesini de kullanabilirsiniz . Bu muhtemelen en iyi şeydir çünkü en esnek ve sağlamdır.

Market uygulamasının orada olup olmadığını kontrol edebilirsiniz.

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

Listede en az bir giriş varsa, Market oradadır.

Uygulamanızın sayfasında Android Market'i başlatmak için aşağıdakileri kullanabilirsiniz, biraz daha otomatiktir:

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

Bunu emülatörünüzde test etmek istiyorsanız, muhtemelen piyasada yüklü değilsiniz: daha fazla ayrıntı için bu bağlantılara bakın:

Google Android Emulator'da Android Market Nasıl Etkinleştirilir

Google Play'i Android Emulator'a Yükleme


Androidmanifest.xml dosyasının neresinde bu kodu yerleştirebilirim? Başka bir şey eklemem gerekiyor mu? Bu, kullanıcının bastığı bir ekranda gerçek bir bağlantıya veya düğmeye nasıl karşılık gelir? Teşekkürler
Adreno

8

Kullanıcılarımın uygulamalarımı derecelendirmesini sağlamak için bu yaklaşımı kullanıyorum:

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

Bu ne için? - market://details?id=Uygulama bağlantım şöylehttps:\\play.google.com\apps\details?id=
Sagar Balyan

2
@SagarBalyan, Google Play Market uygulamasında uygulama sayfanızı açmak için özel bir uri. Bağlantıya sahip aktiviteyi başlatırsanız sağlanan android varsayılan tarayıcınızda uygulama sayfası açılacaktır veya size başlamak için hangi tarayıcıyı uygulaması seçim verecektir
gtgray

5

Kotlin versiyonu

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

Bunu kullanabilirsiniz, benim için çalışıyor

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 Derecelendirmesi

 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

Sizin için işe yarayabilecek başka bir yaklaşım da Linkify. Kullanıcıdan uygulamayı derecelendirmesini isteyen bir TextView varsa, vurgulanan ve kullanıcı onlara dokunduğunda, metinde birkaç kelimeyi kodfyfy olabilir inceleme için hazır, oyun mağazası açılır:

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

GetPackageName () stratejisine dayalı uygulamalara sahip tüm yanıtlarla ilgili bir nokta, BuildConfig.APPLICATION_ID kullanımının daha basit olabileceğidir ve farklı uygulama kimliğine sahip birden fazla uygulama oluşturmak için aynı kod tabanını kullanırsanız (örneğin, beyaz etiketli ürün).


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, Play Store'daki Geliştirici Hesabının adıdır


2

Etkinliğinizde uygulamanızı derecelendirmek için bu basit kodu kullanabilirsiniz.

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

Bu ne için? - market://details?id=Uygulamam link gibihttps:\\play.google.com\apps\details?id=
Sagar Balyan

@SagarBalyan Kullanıcının birden fazla uygulama pazarı varsa, varsayılan mağazayı açar veya mevcut her mağazaya bir niyet gösterir.
Avi Parshan

2

İstisna tabanlı programlama kullanmadan bu ve bu yanıtı birleştirerek aşağıdaki yaklaşımı kullanıyorum ve ayrıca API-21 öncesi amaç bayrağını destekliyor.

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

Amaç bayrağı FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESETAPI 21'den kaldırıldığından, @SuppressWarnings("deprecation")uygulama hedefi SDK'm API 21'in altında olduğundan etiketi getRateIntent yönteminde kullanıyorum.


Ayrıca , web sitelerinde önerilen resmi Google yolunu da denedim (6 Aralık 2019). Gördüğüm kadarıyla Play Store uygulaması yüklü değilse durumu ele almıyor:

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

Etkinlik sınıfınızda bir yöntem bildirin. Ardından aşağıdaki kodu kopyalayıp yapıştırın.

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

}

Şimdi bu yöntemi kodunuzun herhangi bir yerinden çağırın.

Pratik projemden aşağıdaki resmi takip edin.

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.