如何获取android中所有非系统应用程序的列表

如何获取android中所有非系统应用程序的列表,android,activity-manager,Android,Activity Manager,我正在开发一个应用程序,我想在其中获得所有非系统应用程序的列表。以下是我的代码部分: TextView tv = new TextView(this); this.setContentView(tv); ActivityManager actvityManager = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE ); PackageManager pm = t

我正在开发一个应用程序,我想在其中获得所有非系统应用程序的列表。以下是我的代码部分:

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

            }
        }
TextView电视=新的TextView(本);
这个.setContentView(电视);
ActivityManager actvityManager=(ActivityManager)
这个.getSystemService(活动\服务);
PackageManager pm=this.getPackageManager();
List List=pm.getInstalledPackages(0);

对于(int i=0;i如果一个应用程序是非系统应用程序,它必须有一个可以启动它的启动意图。如果启动意图为空,则它是一个系统应用程序

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

仅具有启动意图的标准可能不可靠。它将一些系统应用程序列为非系统应用程序,反之亦然。下面的代码给出了所有可启动的非系统应用程序,并且工作正常

    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);
        }
    }
PackageManager pm=getPackageManager();
List packages=m.getInstalledApplications(PackageManager.GET_元数据);
对于(ApplicationInfo appInfo:packages)
{
字符串currAppName=pm.getApplicationLabel(appInfo.toString();
字符串srcDir=appInfo.sourceDir;
//Log.d(标记,currAppName+“:”+srcDir);
if(srcDir.startsWith(“/data/app/”)&&pm.getLaunchIntentForPackage(appInfo.packageName)!=null)
{
Log.d(标签,“非系统应用程序:”+srcDir);
}
}
解决方案
PackageManager
提供了使用
PackageManager.MATCH_system_ONLY
标志直接查找系统应用程序(但非系统应用程序)的方法

列表,此类应用具有
标志\u SYSTEM
标志。我们使用此标志查找非系统应用:

List packages=pm.getinstalledApplication(PackageManager.GET_META_DATA);
对于(ApplicationInfo packageInfo:packages){
if((packageInfo.flags和ApplicationInfo.FLAG\u系统)==ApplicationInfo.FLAG\u系统){
//系统应用程序
}
否则{
//非系统应用程序
}
}

从两种方法获得的应用程序计数正确无误。

检查此问题@asloob代码给出的是所有系统应用程序,,,这不是必需的。我只需要非系统应用程序。我如何筛选此答案是否比以前的答案更好,但由于Android Oreo,因此不再100%准确: