135

Google Play からアプリをインストールしようとしています。Google Play ストアの URL を開くと Google Play が開き、[戻る] ボタンを押すとアクティビティが再開されることがわかります。

Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(appURL));
marketIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
startActivity(marketIntent);

アクティビティに戻ったときにonResume()、アプリがインストールされているかどうかを確認するためにこれを呼び出してみましたが、エラーが発生しました。

@Override
protected void onResume() {
    super.onResume();
    boolean installed = false;
    while (!installed) {
        installed  =   appInstalledOrNot(APPPACKAGE);
        if (installed) {
             Toast.makeText(this, "App installed", Toast.LENGTH_SHORT).show();
        }
    }
}

private boolean appInstalledOrNot(String uri) {
  PackageManager pm = getPackageManager();
  boolean app_installed = false;
  try {
      pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
      app_installed = true;
  }
  catch (PackageManager.NameNotFoundException e) {
      app_installed = false;
  }
  return app_installed ;
}

エラーは次のとおりです。

E/AndroidRuntime(796): java.lang.RuntimeException: アクティビティ ComponentInfo を開始できません {com.example.appinstaller/com.example.appinstaller.MainActivity}: android.content.ActivityNotFoundException: Intent を処理するアクティビティが見つかりません { act=android .intent.action.VIEW dat=market://details?id=com.package.name flg=0x40080000 }

活動は だと思いonPause()ます。それを実装するより良い方法はありますか?アプリのインストールが完了したかどうかを確認しようとしています。

4

11 に答える 11

362

これを試して:

private boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    try {
        packageManager.getPackageInfo(packageName, 0);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

渡された名前のパッケージに関する情報を取得しようとします。失敗した場合、 aNameNotFoundExceptionがスローされた場合、その名前のパッケージがインストールされていないことを意味するため、 を返しfalseます。

PackageManagera の代わりに aを渡すことに注意してください。これにより、このメソッドはより柔軟に使用でき、DemeterContextの法則に違反しなくなります。インスタンスがある限り、インスタンスにアクセスせずにメソッドを使用できます。ContextPackageManager

次のように使用します。

public void someMethod() {
    // ...
    
    PackageManager pm = context.getPackageManager();
    boolean isInstalled = isPackageInstalled("com.somepackage.name", pm);
    
    // ...
}

注:<queries> Android 11 (API 30) 以降、探しているパッケージによっては、マニフェストで宣言する必要がある場合があります。詳細については、ドキュメントをご覧ください。

于 2013-09-11T22:20:16.307 に答える
5

これを試して:

public static boolean isAvailable(Context ctx, Intent intent) {
    final PackageManager mgr = ctx.getPackageManager();
    List<ResolveInfo> list =
        mgr.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}
于 2014-12-31T06:16:26.423 に答える
-1
    private boolean isAppExist() {

    PackageManager pm = getPackageManager();
    try {
        PackageInfo info = pm.getPackageInfo("com.facebook.katana", PackageManager.GET_META_DATA);
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
    return true;
}




if (isFacebookExist()) {showToast(" Facebook is  install.");}
     else {showToast(" Facebook is not install.");}
于 2019-03-17T06:42:57.200 に答える