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


104

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

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:无法启动活动ComponentInfo {com.example.appinstaller / com.example.appinstaller.MainActivity}:android.content.ActivityNotFoundException:未找到处理意图的活动{act = android .intent.action.VIEW dat = market:// details?id = com.package.name flg = 0x40080000}

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



@SiddharthanAsokan如果我理解正确,那么您要在这里实现的目标是,启动您的应用程序->玩商店->单击安装->返回您自己的活动->启动新安装的应用程序。
Varun

不,回到我最初打开的应用程序。我需要获取有关使用PackageManager安装的应用程序的一些信息。在我从用于打开Web URL的初始名称安装应用程序后开始此信息检索。
Siddharthan Asokan

Answers:


299

试试这个:

private boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    try {
        packageManager.getPackageInfo(packageName, 0);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

它尝试获取有关您传入名称的软件包的信息。如果失败,则NameNotFoundException抛出a,表示没有安装具有该名称的软件包,因此我们返回false

请注意,我们传入a PackageManager而不是a Context,以便该方法可以灵活使用,并且不违反Demeter定律Context只要拥有实例,就可以使用该方法而无需访问PackageManager实例。

像这样使用它:

public void someMethod() {
    // ...

    PackageManager pm = context.getPackageManager();
    boolean isInstalled = isPackageInstalled("com.somepackage.name", pm);

    // ...
}

1
条件是:我需要检查此安装过程是否完成。我单击安装,同时我尝试循环检查安装。代码很好,但是检查安装是否完成的方法是我要寻找的。
Siddharthan Asokan

3
@SiddharthanAsokan您可以使用广播接收器执行package_add操作。
Varun

@Varun我刚刚编辑了代码。它不再使用任何应用程序包名称。只需在谷歌Play商店应用程序的Web网址
Siddharthan Asokan

@Robin Kanters请检查我所做的更改
Siddharthan Asokan 2013年

您在问题中所做的与我的回答相同。
罗宾·坎特斯

32

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

5

试试这个:

public static boolean isAvailable(Context ctx, Intent intent) {
final PackageManager mgr = ctx.getPackageManager();
List<ResolveInfo> list =   mgr.queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}

5

更快的解决方案:

private boolean isPackageInstalled(String packagename, PackageManager packageManager) {
    try {
        packageManager.getPackageGids(packagename);
        return true;
    } catch (NameNotFoundException e) {
        return false;
    }
}

getPackageGids的价格较低getPackageInfo,因此可以更快地工作。

Run 10000 on API 15
Exists pkg:
getPackageInfo: nanoTime = 930000000
getPackageGids: nanoTime = 350000000
Not exists pkg:
getPackageInfo: nanoTime = 420000000
getPackageGids: nanoTime = 380000000

Run 10000 on API 17
Exists pkg:
getPackageInfo: nanoTime = 2942745517
getPackageGids: nanoTime = 2443716170
Not exists pkg:
getPackageInfo: nanoTime = 2467565849
getPackageGids: nanoTime = 2479833890

Run 10000 on API 22
Exists pkg:
getPackageInfo: nanoTime = 4596551615
getPackageGids: nanoTime = 1864970154
Not exists pkg:
getPackageInfo: nanoTime = 3830033616
getPackageGids: nanoTime = 3789230769

Run 10000 on API 25
Exists pkg:
getPackageInfo: nanoTime = 3436647394
getPackageGids: nanoTime = 2876970397
Not exists pkg:
getPackageInfo: nanoTime = 3252946114
getPackageGids: nanoTime = 3117544269

注意:这在某些虚拟空间中将不起作用。他们可能会违反Android API,并且始终会返回一个数组,即使没有使用该包名称的应用程序也是如此。
在这种情况下,请使用getPackageInfo


0
    private boolean isAppExist() {

    PackageManager pm = getPackageManager();
    try {
        PackageInfo info = pm.getPackageInfo("com.facebook.katana", PackageManager.GET_META_DATA);
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
    return true;
}




if (isFacebookExist()) {showToast(" Facebook is  install.");}
     else {showToast(" Facebook is not install.");}

0
isFakeGPSInstalled = Utils.isPackageInstalled(Utils.PACKAGE_ID_FAKE_GPS, this.getPackageManager());

//检查软件包安装情况的方法true / false

  public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    boolean found = true;
    try {
      packageManager.getPackageInfo(packageName, 0);
    } catch (PackageManager.NameNotFoundException e) {
      found = false;
    }

    return found;
  }

0

如果您想在没有try catch块的情况下进行尝试,可以使用以下方法,创建一个意图并设置要验证的应用程序的程序包

val intent = Intent(Intent.ACTION_VIEW)
intent.data = uri
intent.setPackage("com.example.packageofapp")

并调用以下方法检查该应用程序是否已安装

fun isInstalled(intent:Intent) :Boolean{
    val list = context.packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
    return list.isNotEmpty()
}

0

那些正在寻找Kotlin解决方案的人可以使用此方法,

在这里,我共享了完整的代码,还处理了启用状态。检查应用程序是否已安装在Android Kotlin中

fun isAppInstalled(packageName: String, context: Context): Boolean {
        return try {
            val packageManager = context.packageManager
            packageManager.getPackageInfo(packageName, 0)
            true
        } catch (e: PackageManager.NameNotFoundException) {
            false
        }
    }

-9
@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;
}

8
这是一个无限循环。
罗宾·坎特斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.