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, но не работает. Есть ли у кого-нибудь предложения? спасибо заранее!
Я изменил свой код на это:
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...
как вы видите здесь, я не могу получить имя приложения, и его значок всегда является одинаковым по умолчанию. Я устал от другого установщика на рынке, и они отлично работают, поэтому кто-нибудь говорит мне, как это сделать? спасибо.
Это правильный ответ, есть некоторые трюки (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;
}
Вы можете использовать метод 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.
Самый простой способ Просто получить значок любого приложения, используя его packageName
public static final Drawable getIconOfAppUsingPackageName(Context context,String packageName)
{
Drawable icon = context.getPackageManager().getApplicationIcon(packageName);
imageView.setImageDrawable(icon);
return icon;
}