如何以编程方式检查 Android 中是不是安装了应用程序?

Posted

技术标签:

【中文标题】如何以编程方式检查 Android 中是不是安装了应用程序?【英文标题】:How to check programmatically if an application is installed or not in Android?如何以编程方式检查 Android 中是否安装了应用程序? 【发布时间】:2012-07-08 16:22:21 【问题描述】:

我们以编程方式安装了应用程序。

    如果应用程序已安装在设备中,应用程序会自动打开。 否则安装特定应用程序。

引导我。我不知道。 谢谢。

【问题讨论】:

android - check for presence of another app的可能重复 【参考方案1】:

试试这个:

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("SampleLog", "Application is already installed.");          
         else 
            // Do whatever we want to do if application not installed
            // For example, Redirect to play store

            Log.i("SampleLog", "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;
    


【讨论】:

@Sathish:希望对你有所帮助 毫无疑问你的帖子真的很有帮助,但我得到一个异常“java.lang.RuntimeException: 添加窗口失败”和“E/AndroidRuntime(7554): Caused by: android.os.TransactionTooLargeException 05-14 11:37:25.305: E/AndroidRuntime(7554): 在 android.os.BinderProxy.transact(Native Method) 05-14 11:37:25.305: E/AndroidRuntime(7554): 在 android.view.IWindowSession $Stub$Proxy.add(IWindowSession.java:516) 05-14 11:37:25.305: E/AndroidRuntime(7554): 在 android.view.ViewRootImpl.setView(ViewRootImpl.java:494) " @BlueGreen:嗨,希望这个链接可以帮助你,***.com/questions/11451393/…,否则如果你正在使用对话框类,请检查它。 :) @Aerrow .. 假设我正在检查我的 .apk 是否已安装?在安装时...我在检查我的包 com.test.installedornot 时遇到同样的异常。我的 .apk 大小超过 9MB 那么在这种情况下我将如何管理这个异常? API 23 Fatal Exception: java.lang.RuntimeException Package manager has died 上崩溃了【参考方案2】:

比公认的答案更清洁的解决方案(基于this question):

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");

This answer 展示了如果应用程序丢失,如何从 Play 商店获取应用程序,但需要注意没有 Play 商店的设备。

【讨论】:

这是否需要任何特定的 Android 权限才能工作? @Bootstrapper:不,它不需要任何特殊权限。 谢谢(工作解决方案)【参考方案3】:

上面的代码对我不起作用。以下方法有效。

使用适当的信息创建一个 Intent 对象,然后使用以下函数检查 Intent 是否可调用:

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

【讨论】:

这样更好,因为它不需要使用异常进行流量控制! @QED 使用异常作为if 语句的人数令人震惊!这绝对是正确的答案 Intent 的内容是什么?带有 packageName 的字符串不起作用 @HenriquedeSousa Intent intent = getPackageManager().getLaunchIntentForPackage("org.package.name"); 如果应用被禁用,应该是错误的。【参考方案4】:

如果您知道包名称,则无需使用 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();

【讨论】:

return !list.isEmpty(); 会更适合 java 风格【参考方案5】:

此代码会检查以确保应用已安装,但也会检查以确保已启用。

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”。我已经编辑了答案以显示 packageName 而不是 uri。【参考方案6】:

使用 kotlin 检查 Android 中是否安装了 App。

创建 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

【讨论】:

【参考方案7】:

使用 Kotlin 的更简单的实现

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

并这样称呼它(寻找 Spotify 应用程序):

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

【讨论】:

【参考方案8】:

比接受的答案(基于AndroidRate Library)更清洁的解决方案(没有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;

【讨论】:

【参考方案9】:

我认为使用 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() ```【参考方案10】:

试试这个

此代码用于检查是否安装了带有包名的应用程序或 如果不是,那么它将打开您的应用程序的 Playstore 链接,否则您的 已安装的应用程序

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

【讨论】:

【参考方案11】:

所有答案仅检查是否安装了某些应用程序。但是,众所周知,一个应用程序可以安装但被用户禁用,无法使用。

因此,此解决方案会同时检查两者。即,已安装并启用的应用

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 */

【讨论】:

【参考方案12】:

@Egemen Hamutçu 在 kotlin 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()
    

【讨论】:

【参考方案13】:

其他问题的一个很酷的答案。 例如,如果您不想区分“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;

【讨论】:

【参考方案14】:

Kotlin suger 效果更好:

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

    val packageManager = context.packageManager

    return runCatching  packageManager.getPackageInfo(packageName, 0) .isSuccess
  

【讨论】:

【参考方案15】:

您可以使用 Kotlin 扩展来做到这一点:

fun Context.getInstalledPackages(): List<String> 
    val packagesList = mutableListOf<String>()
    packageManager.getInstalledPackages(0).forEach 
        if ( it.applicationInfo.sourceDir.startsWith("/data/app/") && it.versionName != null)
            packagesList.add(it.packageName)
    
    return packagesList


fun Context.isInDevice(packageName: String): Boolean 
    return getInstalledPackages().contains(packageName)

【讨论】:

【参考方案16】:

Android 11 更新 您必须在清单中指定要搜索的确切捆绑包 ID。

facebook 和 whatsapp 的示例:

在“应用程序”上方的清单内(权限所在)

<queries>
    <package android:name="com.whatsapp" />
    <package android:name="com.facebook.katana" />
</queries>  

这将允许您检查是否安装了 facebook 和 whatsapp,否则您将始终得到错误的检查。

进一步阅读该主题:https://medium.com/androiddevelopers/package-visibility-in-android-11-cc857f221cd9

【讨论】:

以上是关于如何以编程方式检查 Android 中是不是安装了应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式检查系统上是不是安装了 SQL Server Management Studio?

如何使用 c# 检查 OpenOffice 是不是以编程方式安装

如何以编程方式检查 Photoshop 画笔是不是存在

如何以编程方式检查 Windows 是不是是最新的?

Android:以编程方式检测设备是不是有硬件菜单按钮

检查 Stackable 文件系统是不是以编程方式安装