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()
だと思います。それを実装するより良い方法はありますか?アプリのインストールが完了したかどうかを確認しようとしています。
これを試して:
private boolean isPackageInstalled(String packageName, PackageManager packageManager) {
boolean found = true;
try {
packageManager.getPackageInfo(packageName, 0);
} catch (PackageManager.NameNotFoundException e) {
found = false;
}
return found;
}
渡された名前のパッケージに関する情報を取得しようとします。失敗すると、NameNotFoundException
がスローされた場合、その名前のパッケージがインストールされていないため、false
を返します。
PackageManager
ではなくContext
を渡すことに注意してください。これにより、メソッドの柔軟性がわずかに向上し、 Demeterの法則 に違反しなくなります。 Context
インスタンスがある限り、PackageManager
インスタンスにアクセスせずにメソッドを使用できます。
次のように使用します。
public void someMethod() {
// ...
PackageManager pm = context.getPackageManager();
boolean isInstalled = isPackageInstalled("com.somepackage.name", pm);
// ...
}
Robin Kantersの答えは正しいですが、有効または無効の状態に関係なく、インストールされているアプリをチェックします。
アプリはインストールできますが、ユーザーが無効にできるため、使用できません。
これにより、インストール済みのおよび対応アプリがチェックされます。
public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
try {
return packageManager.getApplicationInfo(packageName, 0).enabled;
}
catch (PackageManager.NameNotFoundException e) {
return false;
}
}
このメソッドをUtils
などのクラスに配置し、次を使用してどこでも呼び出すことができます。
boolean isInstalled = Utils.isPackageInstalled("com.package.name", context.getPackageManager())
これを試して:
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;
}
より高速なソリューション:
private boolean isPackageInstalled(String packagename, PackageManager packageManager) {
try {
packageManager.getPackageGids(packagename);
return true;
} catch (NameNotFoundException e) {
return false;
}
}
getPackageGids
はgetPackageInfo
よりも安価なので、より高速に動作します。
Run 10000 on API 15
Exists pkg:
getPackageInfo: nanoTime = 930000000
getPackageGids: nanoTime = 350000000
Not exists pkg:
getPackageInfo: nanoTime = 420000000
getPackageGids: nanoTime = 380000000
Run 10000 on API 17
Exists pkg:
getPackageInfo: nanoTime = 2942745517
getPackageGids: nanoTime = 2443716170
Not exists pkg:
getPackageInfo: nanoTime = 2467565849
getPackageGids: nanoTime = 2479833890
Run 10000 on API 22
Exists pkg:
getPackageInfo: nanoTime = 4596551615
getPackageGids: nanoTime = 1864970154
Not exists pkg:
getPackageInfo: nanoTime = 3830033616
getPackageGids: nanoTime = 3789230769
Run 10000 on API 25
Exists pkg:
getPackageInfo: nanoTime = 3436647394
getPackageGids: nanoTime = 2876970397
Not exists pkg:
getPackageInfo: nanoTime = 3252946114
getPackageGids: nanoTime = 3117544269
注:これは、一部の仮想スペースでは機能しません。それらはAndroid APIに違反し、そのパッケージ名を持つアプリケーションが存在しない場合でも、常に配列を返します。
この場合、getPackageInfo
を使用します。
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.");}