Androidにアプリケーションがインストールされているかどうかをプログラムで確認する方法は?


147

プログラムでアプリケーションをインストールしました。

  1. アプリケーションがすでにデバイスにインストールされている場合、アプリケーションは自動的に開きます。
  2. それ以外の場合は、特定のアプリケーションをインストールします。

教えて。何も思いつきません。ありがとう。


回答:


317

これで試してください:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Add respective layout
        setContentView(R.layout.main_activity);

        // Use package name which we want to check
        boolean isAppInstalled = appInstalledOrNot("com.check.application");  

        if(isAppInstalled) {
            //This intent will help you to launch if the package is already installed
            Intent LaunchIntent = getPackageManager()
                .getLaunchIntentForPackage("com.check.application");
            startActivity(LaunchIntent);

            Log.i("Application is already installed.");       
        } else {
            // Do whatever we want to do if application not installed
            // For example, Redirect to play store

            Log.i("Application is not currently installed.");
        }
    }

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

        return false;
    }

}

1
@Sathish:参考になれば幸いです
Aerrow

1
間違いなくあなたの投稿は本当に役に立ちますが、例外「java.lang.RuntimeException:Adding window failed」と「E / AndroidRuntime(7554):Caused by:android.os.TransactionTooLargeException 05-14 11:37:25.305 :E / AndroidRuntime(7554):at android.os.BinderProxy.transact(Native Method)05-14 11:37:25.305:E / AndroidRuntime(7554):at android.view.IWindowSession $ Stub $ Proxy.add(IWindowSession .java:516)05-14 11:37:25.305:E / AndroidRuntime(7554):at android.view.ViewRootImpl.setView(ViewRootImpl.java:494) "
DJhon

2
@BlueGreen:こんにちは、このリンクがあなたに役立つことを願って、stackoverflow.com /questions/11451393/… 、そうでなければ、ダイアログクラスを使用している場合は親切にチェックしてください。:)
Aerrow 2014年

1
@Aerrow .. .apkがインストールされているかどうかを確認しているとしましょう。インストール時に... com.test.installedornotをチェックしているときに同じ例外が発生します。私の.apkサイズが9MBを超えている場合、その場合、この例外をどのように管理しますか?
DJhon

@BlueGreen:上記のコードはインストールされたアプリのみをチェックします。インストールの時点ではこれは機能しません。あなたのケースでは、そのapkがインストールされた後にブロードキャストレシーバーを使用して通知を取得します。
Aerrow 2014

65

この質問に基づいて)承認された回答よりもやや明確な解決策:

public static boolean isAppInstalled(Context context, String packageName) {
    try {
        context.getPackageManager().getApplicationInfo(packageName, 0);
        return true;
    }
    catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

私はそれを静的ユーティリティとしてヘルパークラスに入れることにしました。使用例:

boolean whatsappFound = AndroidUtils.isAppInstalled(context, "com.whatsapp");

この回答は、アプリが見つからない場合にPlayストアからアプリを取得する方法を示していますが、Playストアを持たないデバイスでは注意が必要です。


これを機能させるには、特定のAndroid権限が必要ですか?
Bootstrapper

@Bootstrapper:いいえ、特別な権限は必要ありません。
Jonik

おかげで(ワーキングソリューション)
Naveed Ahmad 2017

26

上記のコードは私にとってはうまくいきませんでした。次のアプローチが機能しました。

適切な情報を使用してIntentオブジェクトを作成し、次の関数を使用して、Intentが呼び出し可能かどうかを確認します。

private boolean isCallable(Intent intent) {  
        List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,   
        PackageManager.MATCH_DEFAULT_ONLY);  
        return list.size() > 0;  
}

5
フロー制御に例外を使用する必要がないため、これはより良い方法です!
QED

2
@QED例外をifステートメントとして使用している人の数は恐ろしいほどです。これは間違いなく正しい答えである
ILikeTacos

1
インテントの内容は何ですか?パッケージ名の文字列が機能しない
Henrique de Sousa '18

3
@HenriquedeSousaIntent intent = getPackageManager().getLaunchIntentForPackage("org.package.name");
ドミニクK

アプリケーションが無効になっている場合、それは間違っているはずです。
Hugo

15

パッケージ名がわかっている場合、これは、try-catchブロックを使用したり、一連のパッケージを反復処理したりせずに機能します。

public static boolean isPackageInstalled(Context context, String packageName) {
    final PackageManager packageManager = context.getPackageManager();
    Intent intent = packageManager.getLaunchIntentForPackage(packageName);
    if (intent == null) {
        return false;
    }
    List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    return !list.isEmpty();
}

1
return !list.isEmpty();よりJavaスタイルに優しい
headsvk 2017

7

このコードは、アプリがインストールされていることを確認しますが、有効になっていることも確認します。

private boolean isAppInstalled(String packageName) {
    PackageManager pm = getPackageManager();
    try {
        pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
        return pm.getApplicationInfo(packageName, 0).enabled;
    }
    catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        return false;
    }
}

アプリのパッケージ名です。たとえば、「com.example.apps.myapp」です。uriではなくpackageNameを表示するように回答を編集しました。
youravgjoe

3

try / catchパターンを使用することは、パフォーマンスにとってあまりよくありません。私はこれを使うことを勧めます:

public static boolean appInstalledOrNot(Context context, String uri) {
    PackageManager pm = context.getPackageManager();
    List<PackageInfo> packageInfoList = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES);
    if (packageInfoList != null) {
        for (PackageInfo packageInfo : packageInfoList) {
            String packageName = packageInfo.packageName;
            if (packageName != null && packageName.equals(uri)) {
                return true;
            }
        }
    }
    return false;
}

上記のkotlinのコード `` private fun isAppInstalled(context:Context、uri:String):Boolean {val packageInfoList = context.packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES)return packageInfoList.asSequence()。filter {it?.packageName = = uri} .any()} `` `
Kishan B

3

受け入れられた回答(AndroidRateライブラリに基づく)よりもクリーンなソリューション(try-catchなし):

public static boolean isPackageExists(@NonNull final Context context, @NonNull final String targetPackage) {
    List<ApplicationInfo> packages = context.getPackageManager().getInstalledApplications(0);
    for (ApplicationInfo packageInfo : packages) {
        if (targetPackage.equals(packageInfo.packageName)) {
            return true;
        }
    }
    return false;
}

2

kotlinを使用して、Androidにアプリがインストールされているかどうかを確認します。

kotlin拡張機能を作成しています。

fun PackageManager.isAppInstalled(packageName: String): Boolean = try {
        getApplicationInfo(packageName, PackageManager.GET_META_DATA)
        true
    } catch (e: Exception) {
        false
    }

アプリがインストールされているかどうかを確認できます

if (packageManager.isAppInstalled("AppPackageName")) {
    // App is installed
}else{
    // App is not installed
}

1

これを試して

このコードは、パッケージ名のあるアプリケーションがインストールされているかどうかを確認するために使用されます。インストールされていない場合は、アプリのプレイストアリンクを開きます。

String your_apppackagename="com.app.testing";
    PackageManager packageManager = getPackageManager();
    ApplicationInfo applicationInfo = null;
    try {
        applicationInfo = packageManager.getApplicationInfo(your_apppackagename, 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    if (applicationInfo == null) {
        // not installed it will open your app directly on playstore
        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + your_apppackagename)));
    } else {
        // Installed
        Intent LaunchIntent = packageManager.getLaunchIntentForPackage(your_apppackagename);
        startActivity( LaunchIntent );
    }

1

Kotlinを使用したより簡単な実装

fun PackageManager.isAppInstalled(packageName: String): Boolean =
        getInstalledApplications(PackageManager.GET_META_DATA)
                .firstOrNull { it.packageName == packageName } != null

そして、次のように呼び出します(Spotifyアプリを探します):

packageManager.isAppInstalled("com.spotify.music")

0

@EgemenHamutçuのコトリンでの回答B-)

    private fun isAppInstalled(context: Context, uri: String): Boolean {
        val packageInfoList = context.packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES)
        return packageInfoList.asSequence().filter { it?.packageName == uri }.any()
    }

0

すべての回答は、特定のアプリがインストールされているかどうかを確認するだけです。しかし、誰もが知っているように、アプリはインストールできるがユーザーが無効にできるため、使用できません。

したがって、このソリューションは両方をチェックします。つまり、インストール済みで有効なアプリ

public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
     try {
          return packageManager.getApplicationInfo(packageName, 0).enabled;
     }
     catch (PackageManager.NameNotFoundException e) {
          return false;
     }
}

メソッドを呼び出しますisPackageInstalled()

boolean isAppInstalled = isPackageInstalled("com.android.app" , this.getPackageManager());

ここで、ブール変数isAppInstalledを使用して、好きなことを行います。

if(isAppInstalled ) {
    /* do whatever you want */
}

0

他の問題へのクールな答え。たとえば、「com.myapp.debug」と「com.myapp.release」を区別したくない場合!

public static boolean isAppInstalled(final Context context, final String packageName) {
    final List<ApplicationInfo> appsInfo = context.getPackageManager().getInstalledApplications(0);
    for (final ApplicationInfo appInfo : appsInfo) {
        if (appInfo.packageName.contains(packageName)) return true;
    }
    return false;
}

0

Kotlinシュガーの方がいいです。

  private fun isSomePackageInstalled(context: Context, packageName: String): Boolean {

    val packageManager = context.packageManager

    return runCatching { packageManager.getPackageInfo(packageName, 0) }.isSuccess
  }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.