Android 如何获取apk大小与时间


1,通过PackageManager获得已安装程序:

java代码:
  1. List installedList = mPackageManager.getInstalledPackages(0);  
  2.   
  3. for (PackageInfo info : installedList) {   
  4. mInstalledList.add(info.packageName + ":" + info.applicationInfo.publicSourceDir + ":" + info.application.SourceDir);   
  5. count++;   
  6. }  

packageName取得应用图标应用名称等等;通过PackageInfo的applicationInfo的publicSourceDir获得路径,再通过该路径创建一个文件new File(String dir),得到该文件长度除以1024则取得该应用的大小。
       1)取得程序大小,通过application的publicSourceDir获得。
       2)取得程序时间,通过application的SourceDir获得。

java代码:
new Date(new File(fileDir).lastModified()).toGMTString();


        通过PackageManager类的getInstalledApplications方法返回一个ApplicationInfo数组,ApplicationInfo类中sourceDir可以获取APK的文件路径,从而使用File类读取文件的上次修改时间而实现。但这可能导致:

       1. 无法获取原始的创建时间,可能很早就被创建了,之后被替换了。
       2. 如果这个APK在一个私有的位置,比如app-private目录,使用Market付费购买的应用在这个位置,如果没有Root的Android手机是没有权限读取的,也导致获取时间失败。

       在Android 2.3 API Level为9中,ApplicationInfo类新增的firstInstallTime和lastUpdateTime这两个字段,可以直接获取到APK的创建或上次修改的时间,即使是付费软件也能正常的获取。

java代码:

  1. /** 
  2. * 获取已经安装的软件列表 
  3. * @param getSysPackages 
  4. * @return 
  5. */  
  6.   
  7. public static ArrayList<MyApplicationInfo> getInstalledApps(){   
  8. ArrayList<MyApplicationInfo> res = new ArrayList<MyApplicationInfo>();  
  9. List<ApplicationInfo> installedAppList = mPackageManager.getInstalledApplications(  
  10. PackageManager.GET_UNINSTALLED_PACKAGES);   
  11. if (installedAppList == null) {  
  12. return null;  
  13. }  
  14. List<ApplicationInfo> appList =new ArrayList<ApplicationInfo> ();  
  15. for (ApplicationInfo appInfo : installedAppList) {  
  16. boolean flag = false;  
  17. if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {  
  18. flag = true;  
  19. else if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {  
  20. flag = true;  
  21. }  
  22. if (flag) {  
  23. appList.add(appInfo);  
  24. }  
  25. }  
  26.   
  27. for(int i=0;i<appList.size();i++) {   
  28. ApplicationInfo p = appList.get(i);   
  29. String dir = p.publicSourceDir;  
  30. int size = Integer.valueOf((intnew File(dir).length());  
  31. String date = new Date(new File(dir).lastModified()).toGMTString();   
  32. MyApplicationInfo newInfo = new MyApplicationInfo();   
  33. newInfo.appName = p.loadLabel(mPackageManager).toString();   
  34. newInfo.packageName = p.packageName;   
  35. newInfo.size = round(size);  
  36.   
  37.   
  38. try {  
  39. newInfo.versionName =mPackageManager.getPackageInfo(newInfo.packageName, 0).versionName;  
  40. newInfo.versionCode =String.valueOf(mPackageManager.getPackageInfo(newInfo.packageName, 0).versionCode);  
  41. catch (Exception e) {  
  42. Log.e("PackageUtil", e.getMessage());  
  43. }  
  44. newInfo.icon = p.loadIcon(mPackageManager);   
  45. res.add(newInfo);   
  46. }   
  47. return res;  
  48.   
  49.   
  50. }  

相关内容