首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >检查是否安装了应用程序- Android

检查是否安装了应用程序- Android
EN

Stack Overflow用户
提问于 2013-09-12 06:15:44
回答 11查看 144K关注 0票数 130

我正在尝试从Google Play安装应用程序。我可以理解,在打开Google Play商店URL时,它会打开Google Play,当我按下back按钮时,活动将继续。

代码语言:javascript
复制
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()来检查应用程序是否已安装,但收到一个错误:

代码语言:javascript
复制
@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 activity ComponentInfo{com.example.appinstaller/com.example.appinstaller.MainActivity}:android.content.ActivityNotFoundException:找不到处理意图的活动{ act=android.intent.action.VIEW dat=android.content.ActivityNotFoundException://details?id=com.package.name flg=0x40080000 }

我猜这个活动就是onPause()。有没有更好的方法来实现它?我正在尝试检查应用程序是否已安装完毕。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2013-09-12 06:20:16

试试这个:

代码语言:javascript
复制
private boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    try {
        packageManager.getPackageInfo(packageName, 0);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

它尝试获取有关您传入其名称的包的信息。否则,如果抛出了NameNotFoundException,则意味着没有安装具有该名称的包,因此我们返回false

请注意,我们传入的是PackageManager而不是Context,因此该方法使用起来更加灵活,并且不会违反law of Demeter。只要您有Context实例,就可以在不访问PackageManager实例的情况下使用该方法。

像这样使用它:

代码语言:javascript
复制
public void someMethod() {
    // ...
    
    PackageManager pm = context.getPackageManager();
    boolean isInstalled = isPackageInstalled("com.somepackage.name", pm);
    
    // ...
}

注意:来自Android11(API30)的,您可能需要在清单中声明<queries>,这取决于您正在寻找的包。有关更多信息,请查看the docs

票数 351
EN

Stack Overflow用户

发布于 2020-10-19 07:26:36

从Android 11 (API级别30)开始,大多数用户安装的应用程序默认情况下不可见。在您的清单中,您必须静态声明您将获取有关哪些应用程序的信息,如下所示:

代码语言:javascript
复制
<manifest>
    <queries>
        <!-- Explicit apps you know in advance about: -->
        <package android:name="com.example.this.app"/>
        <package android:name="com.example.this.other.app"/>
    </queries>
    
    ...
</manifest>

然后,@RobinKanters的answer工作了:

代码语言:javascript
复制
private boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    try {
        packageManager.getPackageInfo(packageName, 0);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

// ...
// This will return true on Android 11 if the app is installed,
// since we declared it above in the manifest.
isPackageInstalled("com.example.this.app", pm); 
// This will return false on Android 11 even if the app is installed:
isPackageInstalled("another.random.app", pm); 

单击此处了解更多信息:

票数 60
EN

Stack Overflow用户

发布于 2017-03-07 19:41:15

Robin Kanters的答案是正确的,但它确实会检查已安装的应用程序,而不考虑其启用或禁用状态。

我们都知道,应用程序可以安装,但被用户禁用,因此无法使用。

这将检查已安装的和支持的应用程序:

代码语言:javascript
复制
public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    try {
        return packageManager.getApplicationInfo(packageName, 0).enabled;
    }
    catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

您可以将此方法放在类似Utils的类中,并使用以下命令在任何地方调用它:

代码语言:javascript
复制
boolean isInstalled = Utils.isPackageInstalled("com.package.name", context.getPackageManager())
票数 43
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18752202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档