1./**
2.     * 获取未安装的apk信息
3.     *
4.     * @param ctx
5.     * @param apkPath
6.     * @return
7.     */
8.    public static AppInfoData getApkFileInfo(Context ctx, String apkPath) {
9.        System.out.println(apkPath);
10.        File apkFile = new File(apkPath);
11.        if (!apkFile.exists() || !apkPath.toLowerCase().endsWith(".apk")) {
12.            System.out.println("文件路径不正确");
13.            return null;
14.        }
15.        AppInfoData appInfoData;
16.        String PATH_PackageParser = "android.content.pm.PackageParser";
17.        String PATH_AssetManager = "android.content.res.AssetManager";
18.        try {
19.            //反射得到pkgParserCls对象并实例化,有参数
20.            Class<?> pkgParserCls = Class.forName(PATH_PackageParser);
21.            Class<?>[] typeArgs = {String.class};
22.            Constructor<?> pkgParserCt = pkgParserCls.getConstructor(typeArgs);
23.            Object[] valueArgs = {apkPath};
24.            Object pkgParser = pkgParserCt.newInstance(valueArgs);
25.
26.            //从pkgParserCls类得到parsePackage方法
27.            DisplayMetrics metrics = new DisplayMetrics();
28.            metrics.setToDefaults();//这个是与显示有关的, 这边使用默认
29.            typeArgs = new Class<?>[]{File.class,String.class,
30.                                    DisplayMetrics.class,int.class};
31.            Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod(
32.                    "parsePackage", typeArgs);
33.
34.            valueArgs=new Object[]{new File(apkPath),apkPath,metrics,0};
35.
36.            //执行pkgParser_parsePackageMtd方法并返回
37.            Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser,
38.                    valueArgs);
39.
40.            //从返回的对象得到名为"applicationInfo"的字段对象
41.            if (pkgParserPkg==null) {
42.                return null;
43.            }
44.            Field appInfoFld = pkgParserPkg.getClass().getDeclaredField(
45.                    "applicationInfo");
46.
47.            //从对象"pkgParserPkg"得到字段"appInfoFld"的值
48.            if (appInfoFld.get(pkgParserPkg)==null) {
49.                return null;
50.            }
51.            ApplicationInfo info = (ApplicationInfo) appInfoFld
52.                    .get(pkgParserPkg);
53.
54.            //反射得到assetMagCls对象并实例化,无参
55.            Class<?> assetMagCls = Class.forName(PATH_AssetManager);
56.            Object assetMag = assetMagCls.newInstance();
57.            //从assetMagCls类得到addAssetPath方法
58.            typeArgs = new Class[1];
59.            typeArgs[0] = String.class;
60.            Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod(
61.                    "addAssetPath", typeArgs);
62.            valueArgs = new Object[1];
63.            valueArgs[0] = apkPath;
64.            //执行assetMag_addAssetPathMtd方法
65.            assetMag_addAssetPathMtd.invoke(assetMag, valueArgs);
66.
67.
68.            //得到Resources对象并实例化,有参数
69.            Resources res = ctx.getResources();
70.            typeArgs = new Class[3];
71.            typeArgs[0] = assetMag.getClass();
72.            typeArgs[1] = res.getDisplayMetrics().getClass();
73.            typeArgs[2] = res.getConfiguration().getClass();
74.            Constructor<Resources> resCt = Resources.class
75.                    .getConstructor(typeArgs);
76.            valueArgs = new Object[3];
77.            valueArgs[0] = assetMag;
78.            valueArgs[1] = res.getDisplayMetrics();
79.            valueArgs[2] = res.getConfiguration();
80.            res = (Resources) resCt.newInstance(valueArgs);
81.
82.
83.            // 读取apk文件的信息
84.            appInfoData = new AppInfoData();
85.            if (info!=null) {
86.                if (info.icon != 0) {// 图片存在,则读取相关信息
87.                    Drawable icon = res.getDrawable(info.icon);// 图标
88.                    appInfoData.setAppicon(icon);
89.                    }
90.                if (info.labelRes != 0) {
91.                    String neme = (String) res.getText(info.labelRes);// 名字
92.                    appInfoData.setAppname(neme);
93.                }else {
94.                    String apkName=apkFile.getName();
95.                    appInfoData.setAppname(apkName.substring(0,apkName.lastIndexOf(".")));
96.                }
97.                String pkgName = info.packageName;// 包名
98.                appInfoData.setApppackage(pkgName);
99.            }else {
100.                return null;
101.            }
102.            PackageManager pm = ctx.getPackageManager();
103.            PackageInfo packageInfo = pm.getPackageArchiveInfo(apkPath, PackageManager.GET_ACTIVITIES);
104.            if (packageInfo != null) {
105.                appInfoData.setAppversion(packageInfo.versionName);//版本号
106.                appInfoData.setAppversionCode(packageInfo.versionCode+"");//版本码
107.            }
108.            return appInfoData;
109.        } catch (Exception e) {
110.            e.printStackTrace();
111.        }
112.        return null;
113.    }

  

转载于:https://www.cnblogs.com/cjt-java/archive/2012/05/16/2504187.html

获取SD卡上 未安装 APK文件信息相关推荐

  1. STM32挂载SD卡基于Fatfs文件系统读取文件信息

    STM32挂载SD卡基于Fatfs文件系统读取文件信息

  2. 无法挂载sd卡(android),不能安装APK(1)

    1.应用程序下载的话是默认安装到/mnt/sdcard下的,如果你sd卡没挂载上,系统会提示你request an SD卡或者damage SD卡,所以此时你去这个/mnt/sdcard或者/sdca ...

  3. android安装在sd卡上,android_安装软件到SD卡上

    <android_安装软件到SD卡上>由会员分享,可在线阅读,更多相关<android_安装软件到SD卡上(12页珍藏版)>请在人人文库网上搜索. 1.把 APP2SD 分几步 ...

  4. Android data/media虚拟sd卡,android如何获取SD卡上的多媒体文件

    获取视频文件: ContentResolver contentResolver = mContext.getContentResolver(); String[] projection = new S ...

  5. android获取未安装APK签名信息及MD5指纹

    站在巨人的肩膀上写博客: http://blog.csdn.net/wulianghuan/article/details/18400581 http://www.jb51.net/article/7 ...

  6. android pak文件_Android 获取手机中已安装apk文件信息

    通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下 PackageManager packageManager = this.getPackageManager(); ...

  7. android把音乐存到sd卡上,如何将音乐文件从原始文件夹保存到SD卡中android

    嗨,我需要将音乐文件保存到SD卡我试过使用下面的代码只有文件夹在SD卡中创建的文件夹没有音乐文件保存任何一个建议我在哪里我做了错误...如何将音乐文件从原始文件夹保存到SD卡中android Fill ...

  8. Android获取SD卡上所有图片、视频缩略图和音乐专辑封面

    查询图片 首先,查询Android固有数据库,图片的Uri为Images.Media.EXTERNAL_CONTENT_URI. 以下为具体查询实例,FileInfo为自定义的数据模型. public ...

  9. android 获取sd卡视频文件名,android – 如何获取SD卡上的视频列表

    查询MediaStore内容提供商 一个例子可能是 public static void printNamesToLogCat(Context context) { Uri uri = MediaSt ...

最新文章

  1. 分布式系统的复杂度度量思考
  2. SpringMVC 如何配置aop
  3. MyBatis映射文件(一)
  4. POJ 2083 递归画分形图
  5. zookeeper多种方式安装
  6. esp8266烧录Html文件,实现内置网页控制设备!
  7. Rational Rose建立类图
  8. wps如何删除空白页?wps删除空白页的方法
  9. python对数据进行分类_按Python对数据进行分类
  10. 方舟非专用服务器稳定吗,方舟非专用服务器
  11. Mac电脑截图卡屏了怎么办?
  12. Eclipse中的 项目编码设置
  13. 01_测试基础知识---微信公众号测试点
  14. 《LeetCode之每日一题》:203.提莫攻击
  15. HDU6441(费马大定理)
  16. 名帖55 隋代 楷书《苏孝慈墓志》
  17. PS快速将白底图片变为透明图片的解决办法
  18. Flutter中ListView顶部有空白
  19. 积分分离PID控制算法
  20. 京东云加速扩展“朋友圈” 火力全开大展生态“云”图

热门文章

  1. 查看网络抖动_Linux下3种常用的网络测速工具
  2. 行存、列存,堆表、AO表性能对比 - 阿里云HDB for PostgreSQL最佳实践
  3. 如何真正学好数据科学?
  4. KeyMob聚合平台:为开发者塑造广告变现形式
  5. PHPCMS整合UCENTER后登陆问题
  6. 浅谈Chrome OS
  7. 修改Linux系统分区后挂载问题
  8. 人工智能 深度学习(Deep learning)开源框架
  9. 2016 年最值得程序员阅读的开源书:《全栈增长工程师指南》
  10. wireshark 分析过滤数据