Java 获取非系统应用程序的列表

Java 获取非系统应用程序的列表,java,android,Java,Android,我可以使用软件包管理器获取已安装软件包的列表,但这包括各种系统软件包。我是否可以在此列表上应用任何筛选器,以仅显示从主屏幕调出应用程序列表时将显示的应用程序?您可以使用意图筛选从主屏幕获取应用程序列表: boolean nonSystem = (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0; Intent intent = new Intent(Intent.ACTION_MAIN); int

我可以使用软件包管理器获取已安装软件包的列表,但这包括各种系统软件包。我是否可以在此列表上应用任何筛选器,以仅显示从主屏幕调出应用程序列表时将显示的应用程序?

您可以使用意图筛选从主屏幕获取应用程序列表:

boolean nonSystem = (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0;
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> apps = getPackageManager().queryIntentActivities(intent, 0);
Intent意图=新意图(Intent.ACTION\u MAIN);
intent.addCategory(intent.CATEGORY_启动器);
List apps=getPackageManager().QueryInputActivities(intent,0);

上述答案并不适用于所有情况

如果应用程序是非系统应用程序,则必须具有启动意图,以便启动。如果启动意图为空,则为系统应用,否则为非系统应用

系统应用程序示例:“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
    }
}
PackageManager pm=getPackageManager();
List packages=pm.getinstalledApplication(PackageManager.GET_元数据);
对于(ApplicationInfo packageInfo:packages){
if(pm.getLaunchIntentForPackage(packageInfo.packageName)!=null){
字符串currAppName=pm.getApplicationLabel(packageInfo.toString();
//此应用程序是非系统应用程序
}
}

是的,但这也会过滤我们的相机应用程序。你如何使它不过滤掉这些类型的应用程序?