【问题标题】:Android: how to get the name of apk file programmatically?Android:如何以编程方式获取apk文件的名称?
【发布时间】:2011-09-30 09:04:43
【问题描述】:

由于某些原因,我的应用程序可以使用不同的 apk 名称安装。在启动时,我想知道 apk 文件的名称是什么。你知道怎么做吗?

谢谢!

【问题讨论】:

  • 最好是在发布问题之前尝试一些search
  • 感谢阿迪尔,但它没有回答我的问题。我想获取已复制到设备的 apk 文件的名称,而不是应用程序名称或包名称。关于如何做到这一点的任何想法?
  • 有这方面的消息吗?

标签: android file apk


【解决方案1】:
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 或应用名称。 根据亚历克斯在这里的回答 - https://stackoverflow.com/a/30348666/2026280

    假设你有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;
    }
    

    【讨论】:

      【解决方案3】:

      试试这个:

      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" />
      

      【讨论】:

      • 我认为这仅给出包名称而不是 apk 名称
      • apk 名称很难获取,因为它在签名时重命名
      • 完全不同的 apk 名称和包名称。
      • 您将设置的内容只有您将获得与 pkg 名称相对应的内容。
      • 是的。在浏览运行应用程序的手机内容时,我可以看到无论 apk 名称是什么,apk 名称都更改为“pkg.apk”。因此,在安装之前似乎不可能知道 apk 的名称是什么。这个“pkg.apk”文件安装在/mnt/asec/package_name我感觉在安装之前获取apk的原始名称是不可能的......如果你找到解决方案告诉我。
      【解决方案4】:

      这是通过 getPackageArchiveInfo 从已打包的 apk 文件中实现的:

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

      【讨论】:

        【解决方案5】:

        试试这个对我有用:

        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
                        
                    
        

        【讨论】:

          猜你喜欢
          • 2013-06-03
          • 2017-02-10
          • 1970-01-01
          • 2014-01-17
          • 1970-01-01
          • 2019-06-06
          • 1970-01-01
          • 2019-01-26
          • 2011-01-01
          相关资源
          最近更新 更多