我想创建一个具有以下功能的应用程序。它应该保存它
.apk 文件到 sdcard 。想象一下,我有Button
。单击它时,我必须保存应用程序的 .apk 文件。
答案 0 :(得分:58)
很容易做到这一点..
注意:无需扎根。
这是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
}
答案 1 :(得分:4)
通过一个简单的功能很容易找到并获得所有已安装的应用程序的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;
}
答案 2 :(得分:3)
我不知道官方的方式。但是,似乎APK存储在/data/app
中,文件名为your.package.name-#.apk
,其中your.package.name
是您的包名称(例如com.google.earth
),而#
通常是1或2,但我想它可能会更多。除非您的设备是root用户,否则您无权列出/data/app
中的文件,但您应具有对实际文件的读取权限。您可以尝试将该文件(以1开头并递增直至找到它)复制到SD卡。
或者,如果您可以访问互联网,则可以将APK存储在某个网站位置并直接将其下载到SD卡。
答案 3 :(得分:0)
您可以为此目的使用 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。它具有更多功能。在此处附加源代码和应用程序的链接。看看他们。
答案 4 :(得分:0)
这是我知道的关于如何获取应用程序 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。