Четверг , Ноябрь 16 2017
Главная / Кодинг / Как извлечь установленный APK-файл?

Как извлечь установленный APK-файл?

Как извлечь установленный APK-файл?

Класс PackageManager позволяет нам получить не только список всех зарегистрированных пакетов в системе, но и сами APK-файлы этих пакетов. ApplicationInfo.sourceDirсодержит путь до APK-файла (например, /data/app/имя пакета/base.apk).

Мы можем скопировать файл во внутреннюю кеш-папку нашего приложения, а оттуда уже поделиться с другими приложениями с помощью FileProvider.

Использование FileProvider — рекомендованный Google способ обмена файлами между приложениями. Он, кстати, не требует прав доступа к внешнему хранилищу , так что простое приложение будет иметь на один запрос прав меньше. Вот мы копируем APK в папку с кешем:

public static File copyFileToFilesDir(Context context, String fileName, String name) throws IOException {
  File src = new File(fileName);
  File dst = new File(context.getCacheDir(), name + ".apk");
  FileChannel inChannel = new FileInputStream(src).getChannel();
  FileChannel outChannel = new FileOutputStream(dst).getChannel();
  try {
    inChannel.transferTo(0, inChannel.size(), outChannel);
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
    if (inChannel != null) {
      inChannel.close();
    }
    outChannel.close();
  }
  return dst;
}

Вот как поделиться приложением:

public void shareApk(View view) throws IOException {
  Intent shareIntent = new Intent();
  shareIntent.setAction(Intent.ACTION_SEND);
  shareIntent.setType("application/xml");
  Uri uri = FileProvider.getUriForFile(this, "ru.androidtools.greenbro.files",
    Tools.copyFileToFilesDir(this, app.sourceDir, app.packageName));
  shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
  startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.share_file)));

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *