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


104

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()。それを実装するより良い方法はありますか?アプリのインストールが完了したかどうかを確認しようとしています。



@SiddharthanAsokan私が正しく理解している場合、ここで達成しようとしていることは、アプリを起動する-> Playストアに移動する->インストールをクリックする->自分のアクティビティに戻る->新しくインストールしたアプリを起動する..正しいですか?
Varun

いいえ、最初に開いたアプリに戻りません。PackageManagerを使用して、インストールされているアプリに関する情報を取得する必要があります。この情報の取得は、開いたWeb URLを使用していたイニシャルからアプリをインストールした後に開始されます。
Siddharthan Asokan 2013

回答:


299

これを試して:

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

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

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

次のように使用します。

public void someMethod() {
    // ...

    PackageManager pm = context.getPackageManager();
    boolean isInstalled = isPackageInstalled("com.somepackage.name", pm);

    // ...
}

1
条件は次のとおりです。完了したら、このインストールプロセスを確認する必要があります。私はインストールをクリックし、その間にループでインストールをチェックしようとします。コードは問題ありませんが、インストールが完了したかどうかを確認する方法が探しています。
Siddharthan Asokan 2013

3
@SiddharthanAsokan package_addedアクションにブロードキャストレシーバーを使用できます。
Varun

@Varun私はコードを編集しました。使用しているアプリパッケージ名はもうありません。Google PlayストアでのアプリのウェブURLのみ
Siddharthan Asokan 2013

@Robin Kanters私が行った変更を確認してください
Siddharthan Asokan '11 / 09/11

あなたがあなたの質問でしたことは私の答えと同じです。
Robin Kanters 2013

32

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

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

5

より高速なソリューション:

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


0
    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.");}

0
isFakeGPSInstalled = Utils.isPackageInstalled(Utils.PACKAGE_ID_FAKE_GPS, this.getPackageManager());

//インストールされているパッケージを確認する方法true / false

  public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    boolean found = true;
    try {
      packageManager.getPackageInfo(packageName, 0);
    } catch (PackageManager.NameNotFoundException e) {
      found = false;
    }

    return found;
  }

0

try catchブロックなしで試してみたい場合は、次のメソッドを使用できます。インテントを作成し、確認するアプリのパッケージを設定します

val intent = Intent(Intent.ACTION_VIEW)
intent.data = uri
intent.setPackage("com.example.packageofapp")

次のメソッドを呼び出して、アプリがインストールされているかどうかを確認します

fun isInstalled(intent:Intent) :Boolean{
    val list = context.packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
    return list.isNotEmpty()
}

0

Kotlinソリューションを探している人は、この方法を使用できます。

ここで私は完全なコードを共有し、有効なステータスも処理しました。アプリケーションがAndroid Kotlinにインストールされているかどうかを確認する

fun isAppInstalled(packageName: String, context: Context): Boolean {
        return try {
            val packageManager = context.packageManager
            packageManager.getPackageInfo(packageName, 0)
            true
        } catch (e: PackageManager.NameNotFoundException) {
            false
        }
    }

-9
@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;
}

8
これは無限ループです。
ロビンカンタース2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.