我正在尝试从Google Play安装应用程序。我可以理解,在打开Google Play商店URL时,它会打开Google Play,当我按下back按钮时,活动将继续。
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: 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()
。有没有更好的方法来实现它?我正在尝试检查应用程序是否已安装完毕。
发布于 2013-09-12 06:20:16
试试这个:
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
实例的情况下使用该方法。
像这样使用它:
public void someMethod() {
// ...
PackageManager pm = context.getPackageManager();
boolean isInstalled = isPackageInstalled("com.somepackage.name", pm);
// ...
}
注意:来自Android11(API30)的,您可能需要在清单中声明<queries>
,这取决于您正在寻找的包。有关更多信息,请查看the docs。
发布于 2020-10-19 07:26:36
从Android 11 (API级别30)开始,大多数用户安装的应用程序默认情况下不可见。在您的清单中,您必须静态声明您将获取有关哪些应用程序的信息,如下所示:
<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工作了:
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);
单击此处了解更多信息:
发布于 2017-03-07 19:41:15
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())
https://stackoverflow.com/questions/18752202
复制相似问题