2011-05-18 63 views

回答

15

您可以尝试使用ApplicationInfo类(android.conent.pm)中可用的标志。例如:

... 
PackageManager pm = getPackageManager(); 
List<ApplicationInfo> installedApps = pm.getInstalledApplications(0); 

for (ApplicationInfo ai: installedApps) { 

    if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 
     // System app - do something here 
     ... 
    } else { 
     // User installed app? 
    } 
} 
+1

这实际上并非如此。尽管大多数安装的应用程序遵循'Application.FLAG_SYSTEM'的行为,但某些应用程序可以选择不安装在系统映像上(例如在SD卡上),这不适用。请参阅http://developer.android.com/reference/android/content/pm/ApplicationInfo.html#FLAG_SYSTEM – Phil 2012-01-09 05:48:30

+0

@ClaireSwinson:菲尔是正确的。检查我的答案是一种双重确认方法,以验证应用程序是否是“真实”系统应用程序与否。 – Basher51 2014-08-14 05:01:14

0

对于初学者来说,你不能卸载的系统应用程序,但您可以通过卸载应用程序正常“设置>应用程序>管理应用程序”。

+0

是的,但进入菜单与使用'PackageManager'没有任何关系 – slinden77 2012-11-10 09:28:00

11

忘记PackageManager!你只问过你自己的应用程序。在您的活动#的onCreate(捆绑),你可以叫getApplicationInfo(),并测试其标志是这样的:

boolean isSystemApp = (getApplicationInfo().flags 
    & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) != 0; 
+2

这比接受的答案好得多 – ottel142 2014-10-08 12:00:28

+0

这不一定是真的,@ basher51提到的解决方案应该是正确的答案。原因是系统应用程序仍然可以安装在系统映像之外。这些标志仅适用于安装在设备系统映像中的应用程序 – 2016-09-13 00:47:08

0

一个简单的函数:

public boolean isUserApp(ApplicationInfo ai,boolean getUpdatedSystemApps){  
    if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 
     if(getUpdatedSystemApps==true){ 
      if((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0){ 
       return true; 
      } else { 
       return false; 
      }     
     } 
     return false; 
    } else { 
     return true; 
    } 
} 

你可以使用像上面这样的功能:

PackageManager pm = getPackageManager(); 
List<ApplicationInfo> allApps = pm.getInstalledApplications(0); 

for (ApplicationInfo ai: allApps) { 

    if (isUserApp(ai,true)) { 
     // User app or Updated SystemApp - do something here 
     ... 
    } else { 
     // System app 
    } 
} 
相关问题