휴대 전화의 Google Play 스토어 앱에서 '이 앱 평가'링크


266

휴대 전화에서 사용자의 Google Play 스토어 앱에서 앱 목록을 열려면 Android 앱에 '이 앱 평가'링크를 추가하고 싶습니다.

  1. 휴대 전화의 Google Play 스토어 앱에서 market://또는 http://링크를 열 려면 어떤 코드를 작성해야 하나요?
  2. 코드를 어디에 넣습니까?
  3. 누구든지 이것에 대한 샘플 구현이 있습니까?
  4. 당신은 화면 지정해야합니까 market://또는 http://링크가 배치됩니다 및 사용에 가장 잘입니다 - market://http://?

여기에는 필요한 모든 것이 있습니다 : github.com/delight-im/AppRater 그리고 소스 코드를 찾아서 어떻게 수행되는지 이해할 수 있습니다.
caw

답변:


555

다음 코드를 사용하여 앱에서 Play 스토어를 엽니 다.

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

앱 페이지가 이미 열려있는 상태에서 Play 스토어가 시작됩니다. 사용자는 그곳에서 평가할 수 있습니다.


2
androidmanifest.xml에서이 코드를 어디에 배치합니까? 다른 것을 추가해야합니까? 사용자가 누르는 화면의 실제 링크 또는 버튼과 어떻게 일치합니까? 감사합니다
Adreno

1
매니페스트에 코드를 추가 할 필요가 없습니다. 이 코드는 버튼 / 링크의 OnClickListener 내에 배치하기 만하면되므로 버튼을 클릭하면 코드가 실행되고 Play 스토어가 시작됩니다.
miguel.rodelas

61
이 솔루션은 Play 마켓 백 스택에는 포함되지 않습니다. 뒤로 버튼을 누른 후에는 응용 프로그램으로 돌아 가지 않습니다. 원하는 경우 다음 줄을 추가하십시오. 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 :이 상수는 API 레벨 21에서 더 이상 사용되지 않습니다. API 21부터이 대신 사용해야하는 FLAG_ACTIVITY_NEW_DOCUMENT와 동일하게 수행됩니다.
xnagyg

1
비 활동 자바 클래스에서 호출하는 경우 context.startActivity (goToMarket)와 같은 컨텍스트를 전달해야합니다.
DMur

47

작동하고 최신 코드는 다음과 같습니다. :)

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

Activity호출하고자 하는 곳에 코드를 넣으십시오 .
사용자가 버튼을 클릭하여 앱을 평가하면 rateApp()함수를 호출하기 만하면 됩니다.


무엇 NuGet 패키지 내가 추가해야하고, 어떤 네임 스페이스를 내가해야 using에 대한 Intent실행 가능한 유형으로? Android.Content를 찾았 지만 IntentXamarin Forms 에서 손실되었습니다 .
s3c

24

나는 항상이 코드를 사용한다 :

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

4
항상 라이너 같은 :).
androidStud

나는 그것을 사용하지만이 android-content.ActivityNotFoundException : Intent {act = android.intent.action.VIEW dat = market : // details? id = PackageName}`-처리 할 수있는 오류가 없음을 보여줍니다. ?
Mina Dahesh

이것을 확인할 수 있습니까 ?
카베 자스

@ 카베 자스. 일반적으로 전화로 존재하는 모든 시장을 보여주고 싶습니다. 내 앱이 존재하면 마켓에서 앱을 표시합니다. 그럼 어떻게해야합니까?
Mina Dahesh

1
@ 카베 자스. 나는이 코드를 사용한다 :`try {Intent intent = new Intent (Intent.ACTION_VIEW); intent.setData (Uri.parse ( "bazaar : // details? id = vow_note.maxsoft.com.vownote")); intent.setData (Uri.parse ( "myket : // comment? id = vow_note.maxsoft.com.vownote")); startActivity (의도); } catch (ActivityNotFoundException e1) {try {startActivity (new Intent (Intent.ACTION_VIEW, Uri.parse ( "MARKET URL"))); startActivity (new Intent (Intent.ACTION_VIEW, Uri.parse ( "MARKET URL"))); } catch (ActivityNotFoundException e2) {Toast.}`
미나 다헤시

18

Google Play 스토어와 Amazon Appstore 모두에 앱을 게시하는 경우입니다. 또한 사용자 (특히 중국)에 앱 스토어와 브라우저가 모두없는 경우도 처리합니다.

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

당면한 질문에 대답하지 않습니다.

앱의 Amazon 앱 스토어 목록을 여는 코드는 어떻습니까?
isJulian00

무엇 NuGet 패키지 내가 추가해야하고, 어떤 네임 스페이스를 내가해야 using에 대한 Intent실행 가능한 유형으로? Android.Content를 찾았 지만 IntentXamarin Forms 에서 손실되었습니다 .
s3c

10

항상 PackageManager 클래스 에서 getInstalledPackages () 를 호출 하고 마켓 클래스가 설치되어 있는지 확인할 수 있습니다. queryIntentActivities ()를 사용할 수도 있습니다. 를 사용하여 마켓 애플리케이션이 아닌 경우에도 생성 한 인 텐트가 무언가에 의해 처리 될 수 있도록 할 수 있습니다. 가장 유연하고 강력하기 때문에 실제로 수행하는 것이 가장 좋습니다.

마켓 앱이 있는지 확인할 수 있습니다.

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

목록에 하나 이상의 항목이 있으면 마켓이있는 것입니다.

다음을 사용하여 애플리케이션 페이지에서 Android 마켓을 시작할 수 있습니다. 조금 더 자동화되어 있습니다.

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

에뮬레이터에서 이것을 테스트하려면 시장이 설치되어 있지 않을 것입니다. 자세한 내용은 다음 링크를 참조하십시오.

Google Android 에뮬레이터에서 Android 마켓을 활성화하는 방법

Android 에뮬레이터에 Google Play 설치


androidmanifest.xml에서이 코드를 어디에 배치합니까? 다른 것을 추가해야합니까? 사용자가 누르는 화면의 실제 링크 또는 버튼과 어떻게 일치합니까? 감사합니다
Adreno

8

이 방법을 사용하여 사용자가 내 앱을 평가하도록합니다.

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

이게 뭐야? - market://details?id=내 앱 링크는 다음과 같습니다https:\\play.google.com\apps\details?id=
Sagar Balyan

2
@SagarBalyan, Google Play 마켓 애플리케이션에서 앱 페이지를 여는 특별한 URI입니다. 링크로 활동을 시작하면 안드로이드가 기본 브라우저에서 앱 페이지를 열거 나 어떤 브라우저 앱을 시작할지 선택할 수 있습니다
gtgray

5

코 틀린 버전

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

당신은 이것을 사용할 수 있습니다, 그것은 나를 위해 작동합니다

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

플레이 스토어 등급

 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

귀하에게 효과적인 또 다른 접근법은 Linkify입니다. 사용자에게 앱을 평가하도록 요청하는 TextView가 있으면 텍스트에 몇 단어를 연결하여 강조 표시하고 사용자가 해당 단어를 터치하면 Play 스토어가 열리고 검토 준비가 완료됩니다.

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 () 전략을 기반으로 구현 한 모든 답변에 대한 요점은 BuildConfig.APPLICATION_ID를 사용하는 것이 더 간단하고 동일한 코드 기반을 사용하여 다른 앱 ID로 여러 앱을 빌드하는 경우 잘 작동한다는 것입니다 (예 : 화이트 라벨 제품).


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 스토어의 개발자 계정 이름입니다.


2

이 간단한 코드를 사용하여 활동에서 앱을 평가할 수 있습니다.

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

이게 뭐야? - market://details?id=내 앱 링크는 다음과 같습니다https:\\play.google.com\apps\details?id=
Sagar Balyan

@SagarBalyan 사용자에게 여러 앱 마켓이있는 경우 기본 스토어를 열거 나 사용 가능한 모든 스토어에 대한 의도를 표시합니다.
Avi Parshan

2

나는 결합하여 다음과 같은 방법을 사용 하고 없이 대답 사용 도 예외 기반 프로그래밍 및 사전 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());

인 텐트 플래그 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET는 API 21에서 더 이상 사용되지 않으므로 @SuppressWarnings("deprecation")앱 대상 SDK가 API 21 미만이므로 getRateIntent 메소드 에서 태그를 사용합니다 .


또한 그들의 웹 사이트에서 제안 된 공식 Google 방식을 시도했습니다 (2019 년 12 월 6 일). Play 스토어 앱이 설치되어 있지 않은 경우에는 처리하지 않습니다.

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

활동 클래스에서 메소드를 선언하십시오. 그런 다음 아래 코드를 복사하여 붙여 넣습니다.

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

}

이제 코드의 어느 곳에서나이 메소드를 호출하십시오.

내 실제 프로젝트에서 아래 이미지를 따르십시오.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.