这很简单,只需检查设备上已安装的软件包即可...在将操作系统升级到2.3.5之前,可以使用以下代码找到Market / Play商店:
1 2 3 4 5 6 7 8 9 10 11 12 | private static final String GooglePlayStorePackageName ="com.google.market"; void someMethod() { packageManager = getApplication().getPackageManager(); List<PackageInfo> packages = packageManager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES); for (PackageInfo packageInfo : packages) { if (packageInfo.packageName.equals(GooglePlayStorePackageName)) { googlePlayStoreInstalled = true; break; } } } |
由于更新后的某种原因,尽管它位于设备上,但我根本找不到要表示应用程序已安装的软件包名称,因此我可以进入市场。
包名称是否已更改? 还是我看错了方向?
谢谢,
亚当。
更新:
那是检查软件包是否已安装的愚蠢方法……更好的方法是:
1 2 3 4 5 6 7 8 | protected final boolean isPackageInstalled(String packageName) { try { application.getPackageManager().getPackageInfo(packageName, 0); } catch (NameNotFoundException e) { return false; } return true; } |
- 上面的代码工作得很好...谢谢
请注意,这将近5年的代码并不是最佳选择,并且在没有充分理由的情况下检查所有已安装的软件包时Google不会喜欢。请同时检查其他答案。
包名称已更改,现在为com.android.vending
尝试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | private static final String GooglePlayStorePackageNameOld ="com.google.market"; private static final String GooglePlayStorePackageNameNew ="com.android.vending"; void someMethod() { PackageManager packageManager = getApplication().getPackageManager(); List<PackageInfo> packages = packageManager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES); for (PackageInfo packageInfo : packages) { if (packageInfo.packageName.equals(GooglePlayStorePackageNameOld) || packageInfo.packageName.equals(GooglePlayStorePackageNameNew)) { googlePlayStoreInstalled = true; break; } } } |
- 这意味着现在我必须检查两个应用程序是否存在...嗯...不是很好!
-
但是,为什么在
getInstalledPackages() 中使用标志PackageManager.GET_UNINSTALLED_PACKAGES 而不是仅在getInstalledPackages(0) 中使用呢? -
顺便说一下,不是
"com.google.vending" ,而是"com.android.vending" 。不确定旧名称。 - 谢谢,有一条评论:packageManager的声明必须为:PackageManager packageManager,并且也要与Prizoff相同。
- @Prizoff:您可以禁用Google Play商店应用。因此,尽管它不算在已安装的应用程序中,但当我们传递标记GET_UNINSTALLED_PACKAGES时,它将被拾取。
-
那为什么不使用此方法
context.getPackageManager() .getLaunchIntentForPackage("com.google.market") != null || context.getPackageManager() .getLaunchIntentForPackage("com.android.vending") != null) ?它不需要您遍历所有软件包
GooglePlayServices具有一个实用程序类来处理此问题,并提供适当的错误对话框以根据设备中播放服务的状态显示。
API参考:http://developer.android.com/reference/com/google/android/gms/common/GooglePlayServicesUtil.html
- 这是最近的事...我将在接下来的几天内对其进行测试...到目前为止,代码看起来像是一团糟!
- 这的确是!但是,那是谷歌习惯做的:)
- 请注意,开发人员不应混淆Google Play商店应用和Google Play服务。 GooglePlayServicesUtil.isGooglePlayServicesAvailable()检查后一项,这可能是一个指标,但不是必需条件。但是,该类的两个包名称都有常量。恕我直言,如果您要检查现有的Google Play商店应用(例如,因为您要启动market://意图,请使用PackageManager和GOOGLE_PLAY_STORE_PACKAGE。
- 绝对。您要编辑我的评论以使其包含此内容吗?
正如迈克尔在评论中所述,Google Play服务与Google Play商店不同。使用此命令确定设备上是否安装了Play商店:
1 2 3 4 5 6 7 8 9 | public static boolean isPlayStoreInstalled(Context context){ try { context.getPackageManager() .getPackageInfo(GooglePlayServicesUtil.GOOGLE_PLAY_STORE_PACKAGE, 0); return true; } catch (PackageManager.NameNotFoundException e) { return false; } } |
-
请注意,这要求您将
com.google.android.gms:play-services-base:$playServicesVersion 添加到依赖项。 (它不会对要安装的Play服务产生运行时依赖性。) - @Thomas,没有必要。您可以将GooglePlayServicesUtil.GOOGLE_PLAY_STORE_PACKAGE替换为" com.android.vending"
在大多数情况下,我们想了解是否已安装Google Play商店,并在预加载了某些应用程序页面的情况下启动它。
为什么我们不能这样做:
1 2 3 4 5 6 7 | final String appPackageName = getPackageName(); // get your app package name try { Uri uri = Uri.parse("market://details?id=" + appPackageName); startActivity(new Intent(Intent.ACTION_VIEW, uri)); } catch (android.content.ActivityNotFoundException anfe) { // Google Play Store is not available. } |
使用此代码,您可以检查设备上是否已安装Google Play服务。
1 2 3 4 5 6 7 8 9 | int val=GooglePlayServicesUtil.isGooglePlayServicesAvailable(MainActivity.this); if(val==ConnectionResult.SUCCESS) { play_installed=true; } else { play_installed=false; } |
- Google Play服务!= Google Play商店。您可以安装商店,但不能安装GPS,反之亦然。 OP正在要求商店。