Я хочу создать приложение, которое имеет следующие функциональные возможности. Он должен
.apk на sdcard. Представьте, что у меня есть Button
. При нажатии на нее я должен сохранить файл .apk приложения.
Как получить файл .apk приложения программным путем
Ответ 1
Это легко сделать.
- Сначала вы получаете все установленные приложения,
- Для каждого из них вы получите общедоступный исходный каталог.
- скопируйте файл на SDCard.
Примечание. Не нужно корениться.
Вот код 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
}
Ответ 2
Я не знаю официального пути. Тем не менее, кажется, что APK хранится в /data/app
с именем файла your.package.name-#.apk
, где your.package.name
- это ваше имя пакета (например, com.google.earth
) и #
обычно 1 или 2, но я полагаю, что это может пойти больше. Если ваше устройство не внедрено, у вас нет прав на просмотр файлов в /data/app
, но вы должны иметь доступ к чтению к фактическому файлу. Вы можете попытаться скопировать этот файл (начиная с 1 и увеличивать до тех пор, пока не найдете его) на SD-карту.
В качестве альтернативы, если у вас есть доступ в Интернет, вы можете сохранить APK в каком-либо веб-месте и загрузить его прямо на SD-карту.
Ответ 3
Легко найти и получить все установленное приложение 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;
}