PackageManager使用详解

获取已安装应用程序信息

通过Activity的getPackageManager()方法可以得到PackageManager的对象

1.PackageManager 的getInstalledPackages(int flags)方法可以得到所有安装在机器上的程序的包信息类对象List<PackageInfo>,PackageInfo类中有一值applicationInfo可以得到Application的对象。

2.PackageManager的getInstalledApplications(int flags)方法可以得到所有安装在机器上的程序的application对象List<ApplicationInfo>;

 

 Application类继承类PackageItemInfo,在PackageItemInfo类中有方法loadIcon(PackageManagerpm)返回应用程序图标Drawable类型。有方法loadLabel(PackageManager pm)返回应用程序名称,CharSequence类型。

 

  ApplicationInfo中无法获取版本号和版本名。PackageInfo类中有包名、版本名、版本号。

 

  如果只需要安装程序的名字和图片而不需要版本号和版本名信息,用方法2获取ApplicationInfo。如果都需要,用方法1获取PackageInfo,再通过PackageInfo获取ApplicationInfo

 

    PackageItemInfo中有值

public int icon  :  A drawable resource identifier (in the package's resources) of this component's icon.

public int labelRes  :  A string resource identifier (in the package's resources) of this component's label.

是int型,基本用不上。

 

public  String packageName    :  Name of the package that this item is in.

这个是程序的包名,也就是说,可以在ApplicationInfo对象中得到安装程序的图片名字和包名。版本号和版本名只能在PackageInfo中获得。ApplicationInfo与PackageInfo中都能得到包名!

 

           程序名和图片还可以通过PackageManager类获得,PackageManager有方法getApplicationIcon(String packageName)和getApplicationIcon(ApplicationInfo info)都可以获得应用程序的图片,getApplicationLabel(ApplicationInfo info)方法可以获得应用程序的名字。

 

下面这段代码可以得到所有已安装应用启动程序的Activity的信息,即Main Activity Info:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. PackageManager pm = getPackageManager();  
  2.         Intent filter = new Intent(Intent.ACTION_MAIN);  
  3.         filter.addCategory(Intent.CATEGORY_LAUNCHER);  
  4.         List<ResolveInfo>list = pm.queryIntentActivities(filter, PackageManager.GET_RESOLVED_FILTER);  
启动手机里的第1个程序:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. ComponentName cn =new ComponentName(list.get(0).activityInfo.packageName, list.get(0).activityInfo.name);  
  2. Intent intent = new Intent(Intent.ACTION_MAIN);  
  3. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |  
  4.            Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
  5. intent.setComponent(cn);  
  6. startActivity(intent);  


获取apk文件信息:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public static AppInfo getApkFileInfo(Context ctx, String apkPath) {  
  2.        //   System.out.println(apkPath);  
  3.     long q=System.currentTimeMillis();  
  4.           File apkFile = new File(apkPath);  
  5.           if (!apkFile.exists() || !apkPath.toLowerCase().endsWith(".apk")) {  
  6.            System.out.println("文件路径不正确");  
  7.            return null;  
  8.           }  
  9.           AppInfo appInfoData;  
  10.           String PATH_PackageParser = "android.content.pm.PackageParser";  
  11.           String PATH_AssetManager = "android.content.res.AssetManager";  
  12.           try {  
  13.            //反射得到pkgParserCls对象并实例化,有参数  
  14.            Class<?> pkgParserCls = Class.forName(PATH_PackageParser);  
  15.            Class<?>[] typeArgs = {String.class};  
  16.            Constructor<?> pkgParserCt = pkgParserCls.getConstructor(typeArgs);  
  17.            Object[] valueArgs = {apkPath};  
  18.            Object pkgParser = pkgParserCt.newInstance(valueArgs);  
  19.              
  20.            //从pkgParserCls类得到parsePackage方法  
  21.            DisplayMetrics metrics = new DisplayMetrics();  
  22.            metrics.setToDefaults();//这个是与显示有关的, 这边使用默认  
  23.            typeArgs = new Class<?>[]{File.class,String.class,  
  24.                  DisplayMetrics.class,int.class};  
  25.            Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod(  
  26.              "parsePackage", typeArgs);  
  27.              
  28.            valueArgs=new Object[]{new File(apkPath),apkPath,metrics,0};  
  29.              
  30.            //执行pkgParser_parsePackageMtd方法并返回  
  31.            Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser,  
  32.              valueArgs);  
  33.              
  34.            //从返回的对象得到名为"applicationInfo"的字段对象   
  35.            if (pkgParserPkg==null) {  
  36.             return null;  
  37.            }  
  38.            Field appInfoFld = pkgParserPkg.getClass().getDeclaredField(  
  39.              "applicationInfo");  
  40.              
  41.            //从对象"pkgParserPkg"得到字段"appInfoFld"的值  
  42.            if (appInfoFld.get(pkgParserPkg)==null) {  
  43.             return null;  
  44.            }  
  45.            ApplicationInfo info = (ApplicationInfo) appInfoFld  
  46.              .get(pkgParserPkg);     
  47.              
  48.            //反射得到assetMagCls对象并实例化,无参  
  49.            Class<?> assetMagCls = Class.forName(PATH_AssetManager);     
  50.            Object assetMag = assetMagCls.newInstance();  
  51.            //从assetMagCls类得到addAssetPath方法  
  52.            typeArgs = new Class[1];  
  53.            typeArgs[0] = String.class;  
  54.            Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod(  
  55.              "addAssetPath", typeArgs);  
  56.            valueArgs = new Object[1];  
  57.            valueArgs[0] = apkPath;  
  58.            //执行assetMag_addAssetPathMtd方法  
  59.            assetMag_addAssetPathMtd.invoke(assetMag, valueArgs);  
  60.              
  61.              
  62.            //得到Resources对象并实例化,有参数  
  63.            Resources res = ctx.getResources();  
  64.            typeArgs = new Class[3];  
  65.            typeArgs[0] = assetMag.getClass();  
  66.            typeArgs[1] = res.getDisplayMetrics().getClass();  
  67.            typeArgs[2] = res.getConfiguration().getClass();  
  68.            Constructor<Resources> resCt = Resources.class  
  69.              .getConstructor(typeArgs);  
  70.            valueArgs = new Object[3];  
  71.            valueArgs[0] = assetMag;  
  72.            valueArgs[1] = res.getDisplayMetrics();  
  73.            valueArgs[2] = res.getConfiguration();  
  74.            res = (Resources) resCt.newInstance(valueArgs);  
  75.              
  76.             
  77.   
  78.              
  79.            // 读取apk文件的信息  
  80.            appInfoData = new AppInfo();  
  81.            if (info!=null) {  
  82.             if (info.icon != 0) {// 图片存在,则读取相关信息  
  83.              Drawable icon = res.getDrawable(info.icon);// 图标  
  84.              appInfoData.setImage(icon);  
  85.              }  
  86.             else//若从apk文件里读取不出图片,则用默认图片填补image空白。  
  87.             {  
  88.              appInfoData.setImage(res.getDrawable(R.drawable.ic_launcher));  
  89.             }  
  90.             //若label标签没有,则名字为文件名  
  91.             if (info.labelRes != 0) {  
  92.              String neme = (String) res.getText(info.labelRes);// 名字  
  93.              appInfoData.setName(neme);  
  94.             }else {  
  95.              String apkName=apkFile.getName();  
  96.              appInfoData.setName(apkName.substring(0,apkName.lastIndexOf(".")));  
  97.             }  
  98.             String pkgName = info.packageName;// 包名     
  99.             appInfoData.setPackagename(pkgName);  
  100.            }else {  
  101.             return null;//读不出info信息而返回空,影响待测。  
  102.            }     
  103.            PackageManager pm = ctx.getPackageManager();  
  104.            PackageInfo packageInfo = pm.getPackageArchiveInfo(apkPath, PackageManager.GET_ACTIVITIES);  
  105.            if (packageInfo != null) {  
  106.             appInfoData.setVersion(packageInfo.versionName);//版本号  
  107.      //       appInfoData.setAppversionCode(packageInfo.versionCode+"");//版本码  
  108.            }  
  109.            //取得apk文件大小  
  110.            File f=new File(apkPath);  
  111.             if(f.length()/1024>1024)  
  112.             {  
  113.                 appInfoData.setFilesize(f.length()/(1024*1024)+"M");  
  114.             }  
  115.             else  
  116.             {  
  117.                 appInfoData.setFilesize(f.length()/1024+"kb");  
  118.             }  
  119.             appInfoData.setApkpath(apkPath);  
  120.             System.out.println(System.currentTimeMillis()-q);  
  121.            return appInfoData;  
  122.           } catch (Exception e) {   
  123.            e.printStackTrace();  
  124.           }  
  125.           return null;  
  126.          }  


上面的方法是以前百度搜的,的确有效,用的是Java的反射实现的,当时没看懂,现在明白了是代码中很多没用的代码,不建议试用上面的代码,使用下面的代码:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public static Drawable getApkIcon(Context context, String apkPath) {  
  2.     PackageManager pm = context.getPackageManager();  
  3.     PackageInfo info = pm.getPackageArchiveInfo(apkPath,  
  4.             PackageManager.GET_ACTIVITIES);  
  5.     if (info != null) {  
  6.         ApplicationInfo appInfo = info.applicationInfo;  
  7.         appInfo.sourceDir = apkPath;  
  8.         appInfo.publicSourceDir = apkPath;  
  9.         try {  
  10.             return appInfo.loadIcon(pm);  
  11.         } catch (OutOfMemoryError e) {  
  12.             Log.e("ApkIconLoader", e.toString());  
  13.         }  
  14.     }  
  15.     return null;  
  16. }  

--------------------------------------------------------------------获取拥有某权限的应用列表---------------------------------------------------------------------------

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public  List<PackageInfo> getAppListByPermission(String permissionName){  
  2.        List<PackageInfo> appinfos = new ArrayList<PackageInfo>();  
  3.        PackageManager mPackageManager = getPackageManager();  
  4.        List<PackageInfo>  mPackageInfo =    
  5.                mPackageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS);  
  6.          
  7.        // false framework switch   
  8.        for(int i=0;i< mPackageInfo.size(); i++) {  
  9.            String[] mPermissions;  
  10.              
  11.          // ignore local application  ,keep third_party application stay         
  12.            if((mPackageInfo.get(i).applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0 )  
  13.            {    
  14.                 Log.d("ss","OnePermissionTOApplicationList " + mPackageInfo.get(i).applicationInfo.flags + "  "  +  ApplicationInfo.FLAG_SYSTEM);  
  15.                 continue;   
  16.            }            
  17.           // ignore local application  ,keep third_party application stay        
  18.          try {  
  19.            mPermissions = mPackageManager.getPackageInfo(mPackageInfo.get(i).packageName, PackageManager.GET_PERMISSIONS).requestedPermissions;  
  20.           if( mPermissions != null)  
  21.           {  
  22.          for(int j=0; j< mPermissions.length; j++)     
  23.          {  
  24.           if(permissionName.equals(mPermissions[j]))   
  25.           {  
  26.               appinfos.add(mPackageInfo.get(i));  
  27.           }  
  28.          }  
  29.        }  
  30.          }catch (Exception e) {  
  31.        }  
  32.        }  
  33.        return appinfos;  
  34.    }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值