ApplicationInfo与PackageInfo与ResolveInfo的区别

3

我需要访问手机上所有已安装应用的以下信息:

  • 名称
  • 图标
  • 可安装应用程序的 Google Play URL

我查看了 ApplicationInfo,但似乎没有提供这些信息。我听说过 PackageInfo 和 ResolveInfo,但我很困惑它们之间的区别以及在哪里使用哪个?最后,我可以使用什么来查找已安装应用程序的上述三个详细信息?

对于包名称,我得到类似 com.something.some 的东西。

这是我正在使用的代码来获取应用程序:

final PackageManager pm = getPackageManager();
ArrayList<ApplicationData> listAppData = new ArrayList<ApplicationData>();

//get a list of installed apps.
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {
    listAppData.add(new ApplicationData(packageInfo));
}

ApplicationData是我自己的类,我从packageInfo中提取信息。


相关链接:https://dev59.com/_2gu5IYBdhLWcg3wUljt - AskNilesh
3个回答

2

这个函数将返回一个包含图标、名称和包名的应用程序列表。

通过包名,您可以构建以下URL:

https://play.google.com/store/apps/details?id= <PACKAGE>

请参阅:

public class Application {

    private String packageName;
    private String name;
    private Drawable icon;
    private boolean checked;
...

private List<Application> getAllApplications(Context context)
            throws NameNotFoundException {

        PackageManager packageManager = context.getPackageManager();
        List<PackageInfo> packages = packageManager.getInstalledPackages(0);

        List<Application> myPackages = new ArrayList<Application>();

        for (PackageInfo pack : packages) {
            if (pack.versionName == null) {
                continue;
            }

            Application newPack = new Application();
            newPack.setPackageName(pack.packageName);
            newPack.setName(pack.applicationInfo.loadLabel(packageManager)
                    .toString());
            newPack.setIcon(pack.applicationInfo.loadIcon(packageManager));

            myPackages.add(newPack);
        }

        return myPackages;
    }

1

应该在哪里使用哪一个?

这些结构体代表不同查询返回的结果。这些结构体和它们的集合是Java返回一个函数调用多个数据的唯一方式,因此你需要在会返回这些结果的查询中使用它们。

我建议搜索stackoverflow以获取这些结构体的用法示例(即搜索字符串为“stackoverflow structure android”)。其中一个示例是: Android launch browser without specifying a URL

还有一个代码片段:

//Drawable d; Button b;
d = getPackageManager().getApplicationIcon(pkg);
b.setCompoundDrawablesWithIntrinsicBounds(d, null, null, null);

另外还有一个:
 public boolean isPackageInstalled(String targetPackage){
     PackageManager pm=getPackageManager();
     try {
         PackageInfo info=pm.getPackageInfo(targetPackage,PackageManager.GET_META_DATA);
     } catch (NameNotFoundException e) {
         return false;
     }  
     return true;
}

1

简单来说

这些类指向应用程序的同一源AndroidManifest.xml。区别在于访问级别,没有其他区别。有时您需要所有信息,但大多数情况下,您只需要处理特定信息。在这些情况下,无需解析清单文件的所有内容。

PackageInfo可以访问清单的所有内容。如果您想阅读清单的每个细节,则可以使用此选项。

ApplicationInfo可以访问清单文件的Application标记,因此忽略了文件的所有不相关区域。

ResolveInfo可以访问intent-filters,从而忽略所有其他详细信息。

ApplicationInfo和ResolveInfo只是我们可以根据需求使用的方便类。

从文档和一些关于如何使用它们的示例中:

ApplicationInfo文档:

您可以检索有关特定应用程序的信息。这对应于从AndroidManifest.xml的tag收集的信息。

示例:

使用ApplicationInfo.FLAG_SYSTEM标记来过滤系统应用程序。
if ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1)
{
// system app
}

PackageInfo 文档:

关于应用程序包内容的总体信息。这对应于从 AndroidManifest.xml 收集的所有信息。

示例:获取应用程序的 versionCode

long versionCode = 0L;
if (Build.VERSION.SDK_INT >= VERSION_CODES.P) {
        versionCode = packageManager.getPackageInfo(packageName, 0).getLongVersionCode();
} else {
        versionCode = (Long) packageManager.getPackageInfo(packageName, 0).getVersionCode();
}

ResolveInfo文档:

从意图过滤器解析意图后返回的信息。这部分对应于从AndroidManifest.xml的标签中收集的信息。

示例:

final Intent newIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
final List pkgAppsList = context.getPackageManager().queryIntentActivities( newIntent, 0);
for (ResolveInfo rInfo : list) {
System.out.println("Installed Applications supporting category launcher " + rInfo.activityInfo.applicationInfo.loadLabel(pm).toString());
}

上述示例将帮助您获取ResolveInfo以启动应用程序。
PackageManager pm = this.getPackageManager();

Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);

ArrayList<ResolveInfo> list = (ArrayList<ResolveInfo>) 
    pm.queryIntentActivities(intent, PackageManager.PERMISSION_GRANTED);
    for (ResolveInfo rInfo : list) {
    System.out.println("Installed Applications " + rInfo.activityInfo.applicationInfo.loadLabel(pm).toString());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接