Tỷ lệ ứng dụng này Ứng dụng này liên kết trong ứng dụng cửa hàng Google Play trên điện thoại


266

Tôi muốn đặt liên kết "Xếp hạng ứng dụng này" trong Ứng dụng Android để mở danh sách ứng dụng trong ứng dụng cửa hàng Google Play của người dùng trên điện thoại của họ.

  1. Tôi phải viết mã nào để tạo market://hoặc liên http://kết mở trong ứng dụng cửa hàng Google Play trên điện thoại?
  2. Bạn đặt mã ở đâu?
  3. Có ai có một mẫu thực hiện này?
  4. Bạn có phải chỉ định màn hình nơi market://hoặc http://liên kết sẽ được đặt, và cái nào là tốt nhất để sử dụng - market://hoặc http://?

Điều này có mọi thứ bạn cần: github.com/delight-im/AppRater Và bạn có thể tra cứu mã nguồn để hiểu cách thức thực hiện.
caw 3/03/2016

Câu trả lời:


555

Tôi mở Cửa hàng Play từ Ứng dụng của mình với mã sau:

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

Điều này sẽ khởi chạy Cửa hàng Play với trang Ứng dụng của bạn đã được mở. Người dùng có thể đánh giá nó ở đó.


2
Tôi đặt mã này ở đâu trong androidmanifest.xml? Tôi có cần thêm gì nữa không? Làm thế nào mà nó tương ứng với một liên kết hoặc nút thực tế trên màn hình mà người dùng nhấn? Cảm ơn
Adreno

1
Bạn không cần thêm bất kỳ mã nào vào bảng kê khai. Bạn chỉ cần đặt mã này trong OnClickListener của nút / liên kết của bạn, vì vậy khi nhấp vào nút, mã được thực thi và Cửa hàng Play được khởi chạy.
Miguel.rodelas

61
Giải pháp này không được tính với backstack Play market. Sau khi nhấn nút quay lại, bạn không được đưa trở lại ứng dụng của mình. Nếu bạn muốn, hãy thêm dòng này: aim.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: Hằng số này không được dùng ở cấp độ API 21. Kể từ API 21, điều này thực hiện giống hệt với FLAG_ACTIVITY_NEW_DOCUMENT nên được sử dụng thay cho điều này.
xnagyg

1
Nếu gọi từ một lớp java không hoạt động, bạn cần chuyển ngữ cảnh như bối cảnh.startActivity (goToMarket);
DMur

47

Đây là một mã làm việc và cập nhật :)

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

Đặt mã trong Activitybạn muốn gọi nó từ.
Khi người dùng nhấp vào nút để xếp hạng ứng dụng, chỉ cần gọi rateApp()chức năng.


Có gì NuGet Package tôi nên thêm, và những gì không gian tên tôi nên usingcho Intentlà một loại khả thi? Tôi đã tìm thấy Android.Content , nhưng tôi không biết gì Intentvề Xamarin Forms.
s3c

24

Tôi luôn sử dụng mã này:

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

4
Luôn luôn thích một lớp lót. :)
androidStud

tôi sử dụng nó nhưng nó cho thấy lỗi này ?
Mina Dahesh

Bạn có thể kiểm tra điều này ?
Cabezas

@Cabezas. Tôi muốn hiển thị tất cả các thị trường tồn tại trên điện thoại. bằng cách nhấp vào cái nào trong số chúng, nếu ứng dụng của tôi tồn tại, thị trường sẽ hiển thị ứng dụng. Vậy tôi nên làm gì?
Mina Dahesh

1
@Cabezas. tôi sử dụng mã này: `thử {Ý định = ý định mới (Intent.ACTION_VIEW); aim.setData (Uri.parse ("bazaar: // chi tiết? id = vow_note.maxsoft.com.vownote")); aim.setData (Uri.parse ("myket: // bình luận? id = vow_note.maxsoft.com.vownote")); startActivity (ý định); } Catch (ActivityNotFoundException e1) {thử {startActivity (ý định mới (Intent.ACTION_VIEW, Uri.parse ("URL thị trường"))); startActivity (Ý định mới (Intent.ACTION_VIEW, Uri.parse ("URL thị trường"))); } Catch (ActivityNotFoundException e2) {Toast.} `
Mina Dahesh

18

Đây là nếu bạn xuất bản ứng dụng của mình trong cả Google Play Store và Amazon Appstore. Tôi cũng xử lý trường hợp người dùng (đặc biệt là ở Trung Quốc) không có cả cửa hàng ứng dụng và trình duyệt.

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

Không trả lời câu hỏi trong tầm tay.

Còn mã để mở danh sách cửa hàng ứng dụng amazon của ứng dụng của bạn thì sao?
isJulian00

Có gì NuGet Package tôi nên thêm, và những gì không gian tên tôi nên usingcho Intentlà một loại khả thi? Tôi đã tìm thấy Android.Content , nhưng tôi không biết gì Intentvề Xamarin Forms.
s3c

10

Bạn luôn có thể gọi getInstalledPackages () từ lớp PackageManager và kiểm tra để đảm bảo lớp thị trường được cài đặt. Bạn cũng có thể sử dụng queryIntentActivities () để đảm bảo rằng Ý định bạn xây dựng sẽ có thể được xử lý bởi một cái gì đó, ngay cả khi đó không phải là ứng dụng thị trường. Đây có lẽ là điều tốt nhất để làm thực sự bởi vì nó linh hoạt và mạnh mẽ nhất.

Bạn có thể kiểm tra xem ứng dụng thị trường có ở đó không

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

Nếu danh sách có ít nhất một mục, Thị trường ở đó.

Bạn có thể sử dụng cách sau để khởi chạy Android Market trên trang ứng dụng của mình, nó tự động hơn một chút:

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

Nếu bạn muốn kiểm tra điều này trên trình giả lập của mình, có lẽ bạn chưa cài đặt thị trường trên đó: xem các liên kết sau để biết thêm chi tiết:

Cách kích hoạt thị trường Android trong Trình giả lập Google Android

Cài đặt Google Play trên Trình giả lập Android


Tôi đặt mã này ở đâu trong androidmanifest.xml? Tôi có cần thêm gì nữa không? Làm thế nào mà nó tương ứng với một liên kết hoặc nút thực tế trên màn hình mà người dùng nhấn? Cảm ơn
Adreno

8

Tôi sử dụng phương pháp này để khiến người dùng đánh giá ứng dụng của mình:

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

Cái này để làm gì? - market://details?id=Liên kết ứng dụng của tôi giống nhưhttps:\\play.google.com\apps\details?id=
Sagar Balyan

2
@SagarBalyan, Đây là một uri đặc biệt để mở trang ứng dụng của bạn tại ứng dụng google play market. Nếu bạn bắt đầu hoạt động với liên kết mà bạn cung cấp, Android sẽ mở trang ứng dụng của bạn trong trình duyệt mặc định hoặc sẽ cho bạn lựa chọn ứng dụng trình duyệt nào sẽ bắt đầu
gtgray

5

Một phiên bản 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

Bạn có thể sử dụng nó, nó làm việc cho tôi

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

Đánh giá cửa hàng Play

 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

Một cách tiếp cận khác có thể phù hợp với bạn là Linkify. Nếu tôi có TextView đang yêu cầu người dùng xếp hạng ứng dụng, tôi có thể liên kết một vài từ trong văn bản để chúng được tô sáng và khi người dùng chạm vào chúng, cửa hàng play sẽ mở ra, sẵn sàng để họ xem xét:

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

Một điểm liên quan đến tất cả các câu trả lời có triển khai dựa trên chiến lược getPackageName () là việc sử dụng BuildConfig.APPLICATION_ID có thể dễ dàng hơn và hoạt động tốt nếu bạn sử dụng cùng một cơ sở mã để xây dựng nhiều ứng dụng với các id ứng dụng khác nhau (ví dụ: sản phẩm nhãn trắng).


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 là tên của Tài khoản nhà phát triển trên Play Store


2

Bạn có thể sử dụng mã đơn giản này để đánh giá ứng dụng của bạn trong hoạt động.

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

Cái này để làm gì? - market://details?id=Liên kết ứng dụng của tôi giống nhưhttps:\\play.google.com\apps\details?id=
Sagar Balyan

@SagarBalyan Nếu người dùng có nhiều thị trường ứng dụng, nó sẽ mở cửa hàng mặc định hoặc hiển thị cho họ ý định cho mọi cửa hàng có sẵn.
Avi Parshan

2

Tôi sử dụng phương pháp sau đây bằng cách kết hợp nàyđây câu trả lời mà không cần sử dụng lập trình dựa ngoại lệ và cũng hỗ trợ pre-API 21 cờ ý định.

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

Vì cờ mục đích FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESETkhông được dùng từ API 21, tôi sử dụng @SuppressWarnings("deprecation")thẻ trên phương thức getRateIntent vì SDK mục tiêu ứng dụng của tôi nằm dưới API 21.


Tôi cũng đã thử cách Google chính thức được đề xuất trên trang web của họ (ngày 6 tháng 12 năm 2019). Theo những gì tôi thấy, nó không xử lý trường hợp nếu ứng dụng Play Store chưa được cài đặt:

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

Khai báo một phương thức trong lớp hoạt động của bạn. Sau đó sao chép và dán mã dưới đây.

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

}

Bây giờ gọi phương thức này từ bất cứ nơi nào trong mã của bạn.

Thực hiện theo hình ảnh dưới đây từ dự án thực tế của tôi.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.