![](/img/trans.png)
[英]How to get the application name of the APK programmatically (not installed)
[英]How to get the .apk file of an application programmatically
我想创建一个具有以下功能的应用程序。 它应该将其.apk文件保存到sdcard 。 想象一下我有一个Button
。 单击它时,我必须保存应用程序的.apk文件。
这样做很容易..
注意:无需root。
这里是snippt代码:
final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> apps = getPackageManager().queryIntentActivities(mainIntent, 0);
for (ResolveInfo info : apps) {
File file = new File(info.activityInfo.applicationInfo.publicSourceDir);
// Copy the .apk file to wherever
}
通过一个简单的功能,很容易找到并获取所有已安装应用程序的 apk 文件。 下面我写了一个方法,它返回一个 HashMap 对象,该对象包含所有已安装的 apk 文件的绝对路径及其相应的包名。我希望它对您非常有用。
private HashMap<String, String> getAllInstalledApkFiles(Context context) {
HashMap<String, String> installedApkFilePaths = new HashMap<>();
PackageManager packageManager = context.getPackageManager();
List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(PackageManager.SIGNATURE_MATCH);
if (isValid(packageInfoList)) {
for (PackageInfo packageInfo : packageInfoList) {
ApplicationInfo applicationInfo;
try {
applicationInfo = getApplicationInfoFrom(packageManager, packageInfo);
String packageName = applicationInfo.packageName;
String versionName = packageInfo.versionName;
int versionCode = packageInfo.versionCode;
File apkFile = new File(applicationInfo.publicSourceDir);
if (apkFile.exists()) {
installedApkFilePaths.put(packageName, apkFile.getAbsolutePath());
LogHelper.d(getClass(), packageName + " = " + apkFile.getName());
}
} catch (PackageManager.NameNotFoundException error) {
error.printStackTrace();
}
}
}
return installedApkFilePaths;
}
private boolean isValid(List<PackageInfo> packageInfos) {
return packageInfos != null && !packageInfos.isEmpty();
}
现在您调用以下方法来获取特定包名称的 apk 文件:
public File getApkFile(Context context, String packageName) {
HashMap<String, String> installedApkFilePaths = getAllInstalledApkFiles(context);
File apkFile = new File(installedApkFilePaths.get(packageName));
if (apkFile.exists()) {
return apkFile;
}
return null;
}
和getApplicationInfoFrom
方法:
private ApplicationInfo getApplicationInfoFrom(PackageManager packageManager, PackageInfo packageInfo) {
return packageInfo.applicationInfo;
}
我不知道官方的方式。 但是,似乎 APK 存储在/data/app
,文件your.package.name-#.apk
,其中your.package.name
是您的包名称(例如com.google.earth
), #
通常为 1或 2,但我想它可以上升更多。 除非您的设备已 root,否则您无权列出/data/app
中的文件,但您应该拥有对实际文件的读取权限。 您可以尝试将该文件(从 1 开始并递增直到找到)复制到 SD 卡。
或者,如果您可以访问互联网,则可以将 APK 存储在某个 Web 位置并直接将其下载到 SD 卡。
为此,您可以使用PackageManager 和 ApplicationInfo类。
List<ApplicationInfo> packagelist = new ArrayList<>();
File file;
PackageManager packageManager = getPackageManager();
packagelist = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);
if (packagelist.size() > 0) {
for (int i = 0; i < packagelist.size(); i++) {
file = new File(packagelist.get(i).publicSourceDir);
}
这就是您如何获取每个 apk 的 publicSourceDir。 然后您可以将该 apk 复制到特定文件夹中。 在这种情况下不需要 ROOT。
我创建了一个类似的应用程序来从系统和已安装的应用程序中提取 apk。 它还有更多的功能。 在此附上源代码和应用程序的链接。 看看他们。
这是我所知道的有关如何获取应用程序 apk 文件路径的最简单方法:
String classname = "com.mycompany.app.MyActivity";
String apkPath = activity.getApplication().getPackageManager().getApplicationInfo(classname, 0).sourceDir
classname 是您的应用程序 Activity 或 AppCompatActivity 类的名称。
此调用将返回如下内容:
/data/app/com.mycompany.app.MyActivity-89lzYNI0vTAV056RT-WHBw==/base.apk
您将能够读取该文件,但由于其受保护,您将无法写入。 当然,base.apk 是一个 jar。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.