我正在尝试从Google Play安装应用。我了解到,打开Goog​​le Play商店URL时,它会打开Goog​​le Play,当我按“后退”按钮时, Activity 将恢复。

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

回到 Activity 之后,我尝试调用此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 ;
}

错误如下:



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

最佳答案

尝试这个:

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

    // ...
}

07-24 09:49
查看更多