2012-06-07 67 views
1
 String apkPath = apk.getAbsolutePath(); 
     Log.i(getClass().getName(), "addApk(): apkPath = " + apkPath); 
     PackageInfo localPackageInfo = pm.getPackageArchiveInfo(apkPath, 0); 
     localPackageInfo.applicationInfo.sourceDir = apkPath;//! null point exception 

無法獲取apk的圖標,名稱,版本等。我也嘗試了魔術數字8192而不是0,但也不起作用。 任何人有任何建議嗎? Thx提前!從SD卡文件獲取apk信息


我改變了我的代碼如下:

 PackageInfo pi = pm.getPackageArchiveInfo(apkPath, PackageManager.GET_ACTIVITIES); 
     if (pi != null) { 
      ApplicationInfo ai = pi.applicationInfo; 
      Drawable appIcon = pm.getApplicationIcon(ai); 
      String appName = pm.getApplicationLabel(ai).toString(); 
      String appVersion = pi.versionName; 
      String pkgName = ai.packageName; 

      Log.i(getClass().getName(), "pkgName = " + pkgName + ", appName = " + appName + ", appVersion = " + appVersion); 
      adapter.add(new InstallItem(pkgName, appIcon, appName, appVersion)); 
     } 

,並得到這樣的輸出:

PKGNAME = com.chaozh.iReaderFree,APPNAME = com.chaozh.iReaderFree,appVersion = 1.3 .2.0 ...

正如您在此處看到的,我無法獲取應用程序名稱,其圖標始終是默認的相同圖標。 我厭倦了其他安裝程序在市場上,他們的工作很好,所以任何一個告訴我該怎麼做?謝謝。

回答

2

這這個正確的答案,有一些技巧(SDK> 8!):

public Drawable getApkIcon(String path){  
    PackageManager pm = getPackageManager();  
    PackageInfo info = pm.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES);  
    if(info != null){  
     ApplicationInfo appInfo = info.applicationInfo; 

     if(Build.VERSION.SDK_INT >= 8){ 
      appInfo.sourceDir = path; 
      appInfo.publicSourceDir = path; 
     } 

     return appInfo.loadIcon(pm); 
    }   
    return null; 
} 
4

您可以使用PackageManager方法getPackageArchiveInfo從APK文件中檢索信息。假設您的APK住在你的SD卡的根目錄,你可以使用此代碼:

String apkPath = Environment.getExternalStorageDirectory().getAbsolutePath() 
        + "/MyApp.apk"; 
    PackageManager pm = getPackageManager(); 

    PackageInfo info = pm.getPackageArchiveInfo(apkPath, 
          PackageManager.GET_ACTIVITIES); 
    //Log.i("ActivityInfo", "Package name is " + info.packageName); 

    for (android.content.pm.ActivityInfo a : info.activities) { 
     Log.i("ActivityInfo", a.name); 
    } 

有很多,你可以在ActivityInfo和PackageInfo對象找到更多信息。

+0

一些簡單的得到任何應用程序的圖標pkg的圖標和名稱已正確顯示,但其大多數圖標仍然是默認的,名稱是pkgName。 thx都一樣。 – thecr0w

0

最簡單的方法 使用其packageName

public static final Drawable getIconOfAppUsingPackageName(Context context,String packageName) 
{ 
Drawable icon = context.getPackageManager().getApplicationIcon(packageName); 
imageView.setImageDrawable(icon); 
return icon; 
} 
+0

嘗試添加一些解釋。這將有助於理解回答背後的邏輯。 – Luca

+0

@Luca只是傳遞任何應用程序的packageName。它會給你appIcon。 – Nepster

+0

這隻適用於已安裝的應用程序。 op希望應用程序信息來自apk文件系統(sdcard更具體)。 – Thupten