2012-06-07 163 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