2011-04-01 123 views
9

如何获取Android手机上已安装的第三方应用程序的列表。已安装的应用程序是否为第三方

我可以通过下面的代码获得应用程序列表,但我只想要第三方应用程序。

PackageManager pm = context.getPackageManager(); 
appInstalModel.setAppName(p.applicationInfo.loadLabel(context.getPackageManager()).toString()); 
appInstalModel.setAppPkg(p.packageName); 
appInstalModel.setAppVersionName(p.versionName); 
+0

你说的第三方是什么意思?不是来自Google?不是从你? – RoflcoptrException 2011-04-01 14:47:46

+0

@Roflcoptr安装到系统上或由用户安装。 – 2011-04-01 14:51:25

回答

7
List<ApplicationInfo> apps = getPackageManager().getInstalledApplications(0); 
    for (int i=0; i < apps.size(); i++) 
    { 
     if ((apps.get(i).flags & ApplicationInfo.FLAG_SYSTEM) == 1) 
     { 
      //System app 
     } 
    } 
+1

我认为它应该是这样的。 if((apps.get(i).applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)== 1) { // System app } – 2011-04-02 12:54:04

2

ApplicationInfo对象将具有FLAG_SYSTEM标志未设置。 sdmove程序可能有一些示例代码。

+0

完美。我必须研究它。 – 2011-04-01 15:08:37

+0

我如何克隆sdmove项目? – 2011-04-01 15:10:44

2

@Roflcoptr答案的小变化。

List<ApplicationInfo> apps = getPackageManager().getInstalledApplications(0); 
for (int i=0; i < apps.size(); i++) 
{ 
    if ((apps.get(i).applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1) 
    { 
     //System app 
    } 
} 

感谢@Roflcoptr为您的答案。

+3

我强烈建议从'(XXX&ApplicationInfo.FLAG_SYSTEM)== 1) '(XXX&ApplicationInfo.FLAG_SYSTEM)!= 0)'或'(XXX&ApplicationInfo.FLAG_SYSTEM == ApplicationInfo.FLAG_SYSTEM)'。 1仅适用于FLAG_SYSTEM恰好为1,但这是一个硬编码值。 – 2012-11-16 22:37:34

7

RoflcoptrException的答案是正确的。但在某些情况下,它不会为您提供所有已安装的第三方应用程序。 ApplicationInfo也有标志FLAG_UPDATED_SYSTEM_APP被设置

如果该应用已经作为更新安装到内置系统 应用

在我的智能手机这样的应用包括女将点燃,Adobe Reader中, Slacker电台等。这些应用程序没有随电话一起提供,而是从Google Play商店安装的。因此,他们可以被视为第三方应用程序。

因此,您可能还想检查FLAG_UPDATED_SYSTEM_APP标志。

final PackageManager packageManager = _context.getPackageManager(); 
List<ApplicationInfo> installedApplications = 
    packageManager.getInstalledApplications(PackageManager.GET_META_DATA); 

for (ApplicationInfo appInfo : installedApplications) 
{ 
    if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) 
    { 
     // IS A SYSTEM APP 
    } 

    if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) 
    { 
     // APP WAS INSTALL AS AN UPDATE TO A BUILD-IN SYSTEM APP 
    } 
} 
0
public static List<PackageInfo> getInstalledAppList(Context context) { 
     ArrayList<PackageInfo> packList = (ArrayList<PackageInfo>) context.getPackageManager().getInstalledPackages(0); 
     showLog("/n/n ********************** App List ********************"); 
     for (int i = 0; i < packList.size(); i++) { 

      PackageInfo packInfo = packList.get(i); 
      if ((packInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { 
       String appName = packInfo.applicationInfo.loadLabel(context.getPackageManager()).toString(); 
       showLog(appName + "(" + packInfo.packageName + ")"); 
      } else { 
       packList.remove(i); 
       i--; 
      } 
     } 

     showLog("List Size : " + packList.size()); 
     showLog("/n/n ********************** END ********************"); 
     return packList; 
    } 
相关问题