アプリケーションがインストールされているかどうかを確認する - Android 質問する

アプリケーションがインストールされているかどうかを確認する - Android 質問する

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: インテント { act=android.intent.action.VIEW dat=market://details?id=com.package.name flg=0x40080000 } を処理するアクティビティが見つかりません

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

ベストアンサー1

これを試して:

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

注記!

Android 11(API 30)以降では、<queries>マニフェストで宣言する必要があるかもしれないご希望のパッケージに応じてお選びいただけます。ドキュメント詳細については。

使い方:

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

PackageManagerの代わりに を渡すことに注意してくださいContext。これにより、メソッドはより柔軟に使用でき、デメテルの法則Contextインスタンスがあれば、インスタンスにアクセスしなくてもメソッドを使用できますPackageManager

使い方:

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

おすすめ記事