Android:如何通过编程获取apk文件的名称?

7

由于某些原因,我的应用可以使用不同的apk名称进行安装。在启动时,我想知道apk文件的名称。你知道如何做吗?

谢谢!


2
最好在发布问题之前尝试一些搜索 - Adil Soomro
4
谢谢 Adil 但是他的回答并没有解决我的问题。我想要获取已复制到设备上的 APK 文件的名称,不是应用程序名称或包名。你有什么建议吗? - toto_tata
这方面有什么消息吗? - W.M.
5个回答

5
final PackageManager pm = getPackageManager();
String apkName = "example.apk";
String fullPath = Environment.getExternalStorageDirectory() + "/" + apkName;        
PackageInfo info = pm.getPackageArchiveInfo(fullPath, 0);

您可以使用以下方法获取它:

info.versionCod

并且

info.versionName

希望这能帮到你。

2
可以使用包管理器获取apk或应用程序名称。 根据alex在这里的答案 - https://dev59.com/NmjWa4cB1Zd3GeqPpUwC#30348666 假设您有apk文件的路径。
public static String getAppLabel(PackageManager pm, String pathToApk) {  
PackageInfo packageInfo = pm.getPackageArchiveInfo(pathToApk, 0);

if (Build.VERSION.SDK_INT >= 8) {
    // those two lines do the magic:
    packageInfo.applicationInfo.sourceDir = pathToApk;
    packageInfo.applicationInfo.publicSourceDir = pathToApk;
}

CharSequence label = pm.getApplicationLabel(packageInfo.applicationInfo);
return label != null ? label.toString() : null;
}

1

试试这个:

ActivityManager actMngr = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
string runningPkg = actMngr.getRunningTasks(1).get(0).topActivity.getPackageName();

PackageManager pm = context.getPackageManager();
ApplicationInfo ai = pm.getApplicationInfo(runningPkg , 0);

添加:

如果您无法获取apk名称,则可以将其与已安装的pkg进行比较,然后获取相应的应用程序名称。您可以像这样获取已安装应用程序的pkg名称和应用程序名称:

ArrayList<PackageInfo> res = new ArrayList<PackageInfo>();
PackageManager pm = ctx.getPackageManager();
List<PackageInfo> packs = pm.getInstalledPackages(0);

for(int i=0;i<packs.size();i++) {
    PackageInfo p = packs.get(i);
    String description = (String) p.applicationInfo.loadDescription(pm);
    String  label= p.applicationInfo.loadLabel(pm).toString();
//Continue to extract other info about the app...
}

请注意:将此权限添加到清单文件中:
<uses-permission android:name="android.permission.GET_TASKS" />

1
我认为这只提供了包名,而不是APK名称。 - Nikunj Patel
获取APK名称很困难,因为它在签名时重命名。 - Nikunj Patel
你所设置的只有与包名相对应的内容。 - Vineet Shukla
我听不懂你说什么了! - Nikunj Patel
1
是的。当我在运行应用程序的手机上探索内容时,我可以看到apk名称被更改为“pkg.apk”,无论apk名称是什么。因此,似乎不可能知道安装前apk的名称。这个“pkg.apk”文件被安装在/mnt/asec/package_name中。我感觉在安装前获取apk的原始名称是不可能的...如果你找到了解决方案,请告诉我。 - toto_tata
显示剩余3条评论

0

这可以通过从已经打包好的apk文件中使用getPackageArchiveInfo来实现:

  PackageInfo package_info = pm.getPackageArchiveInfo(file_path_to_apk, 0);

0

你可以试试这个,对我很有效:

String versionName = "null"; //String apk versionName
                int versionCode = -1; //int versionCode
                String APKFilePath = "/storage/emulated/0/apkname.apk"; //For example
                PackageManager pm = getPackageManager();
                PackageInfo    packageInfo = pm.getPackageArchiveInfo(APKFilePath, 0);
                // the secret are these two lines
                packageInfo.applicationInfo.sourceDir       = APKFilePath;
                packageInfo.applicationInfo.publicSourceDir = APKFilePath;
                Drawable APKicon = packageInfo.applicationInfo.loadIcon(pm); //drawable apk icon
                String   AppName = (String)packageInfo.applicationInfo.loadLabel(pm); // String apk name
                    versionName = packageInfo.versionName; //String version name
                    versionCode = packageInfo.versionCode; //int version code
                    apk_icon.setImageDrawable(APKicon);    //ImageView apk icon
                    Apkpackage.setText(packageInfo.packageName); //TextView apk package name
                    Apkname.setText(AppName); //TextView apk name
                    Apkversion.setText(String.format("Version Name: %s Version Code:%d", versionName, versionCode)); //TextView versionName and versionCode
                
            

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接