对于手机上安装的所有应用,我需要访问:
我查看了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
中提取信息答案 0 :(得分: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 :(得分:1)
此功能将返回带有图标,名称和包的应用列表。
使用该软件包,您可以使用以下内容构建网址:
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;
}
答案 2 :(得分:1)
简单来说
这些类指向Application的相同源AndroidManifest.xml。 区别仅在于访问级别。 有时您需要所有信息,但大多数时候需要 仅处理特定信息。在那种情况下,没有必要 解析清单文件的所有内容。
PackageInfo
有权访问清单中的所有内容。如果您想阅读清单的每一个细节,可以使用它
ApplicationInfo
有权访问清单文件的应用标签,因此忽略了文件的所有不相关区域。
ResolveInfo可以访问意图过滤器,因此忽略了所有其他详细信息。
ApplicationInfo和ResolveInfo只是我们可以根据需要使用的便捷类。
从文档以及有关如何使用它们的一些示例中:
ApplicationInfo 文档:
您可以检索有关特定应用程序的信息。这个 对应于从AndroidManifest.xml收集的信息 标签。
示例:
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 文档:
解决针对某项的意图所返回的信息 IntentFilter。这部分对应于从 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());
}