我正在开发一个应用程序,在其中我想获得所有非系统应用程序的列表。下面是我的代码部分:
TextView tv = new TextView(this);
this.setContentView(tv);
ActivityManager actvityManager = (ActivityManager)
this.getSystemService( ACTIVITY_SERVICE );
PackageManager pm = this.getPackageManager();
List<PackageInfo> list =pm.getInstalledPackages(0);
for(int i=0;i<list.size();i++)
{
System.out.println("list"+i+" "+list.get(i));
}
for(PackageInfo pi : list)
{
try
{
ApplicationInfo ai=pm.getApplicationInfo(pi.packageName, 0);
if (ai.sourceDir.startsWith("/data/app/"))
{
tv.setText(ai.className);// non system apps
}
else
{
System.out.println("system apps");// system apps
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
但它显示,所有应用程序都是系统应用程序
发布于 2013-08-20 04:13:13
如果应用程序是非系统应用程序,则它必须具有启动意图,通过该意图可以启动该应用程序。如果启动意图为空,则它是一个系统应用程序。
系统应用示例:"com.android.browser.provider“、"com.google.android.voicesearch”。
对于上面的应用,当你查询启动意图时,你会得到NULL。
PackageManager pm = getPackageManager();
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
for(ApplicationInfo packageInfo:packages){
if( pm.getLaunchIntentForPackage(packageInfo.packageName) != null ){
String currAppName = pm.getApplicationLabel(packageInfo).toString();
//This app is a non-system app
}
else{
//System App
}
}
发布于 2020-04-27 23:08:07
解决方案
PackageManager
提供了一种使用PackageManager.MATCH_SYSTEM_ONLY
标志直接查找系统应用程序(而不是非系统应用程序)的方法。
List<ApplicationInfo> systemPackages = pm.getInstalledApplications(PackageManager.MATCH_SYSTEM_ONLY);
但是有一个变通方法。According to documentation,这样的应用程序都有FLAG_SYSTEM
标志。我们使用此标志来查找非系统应用程序:
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
for (ApplicationInfo packageInfo : packages) {
if ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM) == ApplicationInfo.FLAG_SYSTEM) {
//system app
}
else {
//non system app
}
}
这两种方法获得的应用计数都是正确的。
发布于 2016-10-13 14:48:44
只有发射意图的标准可能是不可靠的。它将一些系统应用程序列为非系统应用程序,反之亦然。下面的代码给出了所有可启动的非系统应用程序,它工作得很好。
PackageManager pm = getPackageManager();
List<ApplicationInfo> packages = m.getInstalledApplications(PackageManager.GET_META_DATA);
for(ApplicationInfo appInfo:packages)
{
String currAppName = pm.getApplicationLabel(appInfo).toString();
String srcDir = appInfo.sourceDir;
//Log.d(TAG, currAppName+": "+srcDir);
if(srcDir.startsWith("/data/app/") && pm.getLaunchIntentForPackage(appInfo.packageName) != null)
{
Log.d(TAG, "NON-SYSTEM APP:"+srcDir);
}
}
https://stackoverflow.com/questions/16712450
复制相似问题