1. ホーム
  2. android

[解決済み] アプリケーションがインストールされているか確認する - Android

2022-06-16 06:29:10

質問

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: Unable to start アクティビティ ComponentInfo{com.example.appinstaller/com.example.appinstaller.MainActivity}: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=market://details?id=com.package.name flg=0x40080000 }.

というアクティビティだと思います。 onPause() . もっと良い実装方法があるのでしょうか?アプリのインストールが終了したかどうかを確認したいのですが。

どのように解決するのですか?

これを試してみてください。

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

渡された名前のパッケージに関する情報を取得しようとします。失敗した場合は NameNotFoundException が投げられた場合、その名前のパッケージはインストールされていないことを意味しますので、私たちは false .

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

このように使います。

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

注意 Android 11 (API 30)からは <queries> をマニフェストで宣言する必要があるかもしれません。チェックアウト ドキュメント を参照してください。