Как управлять установкой из неизвестных источников в Android Oreo?

В Android Oreo (8.0) было внесено несколько изменений, касающихся того, как разрешить установку приложений из неизвестных источников (с точки зрения пользователя) и к процессу получения разрешения на их установку (с точки зрения разработчика).

Поскольку мне было особенно сложно найти все шаги, необходимые для разработчика, я подумал, что полезно спросить здесь о решении и ответить на вопрос сам, теперь, когда я нашел ответы, для будущих ссылок на тех, кто сталкиваясь с теми же препятствиями.

Ответ будет включать следующие вопросы:

  1. Как проверить, разрешено ли мне запрашивать установку пакета?
  2. Какое точное разрешение я должен запросить?
  3. Как я могу предложить пользователю предоставить это разрешение?
  4. Как я могу предложить пользователю установить указанный.apk?

(Если я все еще пропущу что-нибудь здесь, я был бы благодарен за любые дополнительные ответы или комментарии, указывающие на это.)

Ответ 1

Для начала ваше приложение должно объявить targetSdkVersion 26 (уровень API для Android Oreo) или выше в вашем файле build.gradle или AndroidManifest.xml, чтобы все это работало.

Затем, чтобы ответить на вопросы выше:

  1. Как проверить, разрешено ли мне запрашивать установку пакета?

Вы можете проверить это с помощью getPackageManager().canRequestPackageInstalls() любом месте вашего кода активности. Обратите внимание, что этот метод всегда возвращает false, если вы не объявляете соответствующее разрешение или не задаете неправильную версию SDK.

  1. Какое точное разрешение я должен запросить?

Вы должны объявить Manifest.permission.REQUEST_INSTALL_PACKAGES в вашем AndroidManifest.xml, например:

    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
  1. Как я могу предложить пользователю предоставить это разрешение?

Вы можете отправить пользователя в соответствующий пункт назначения с помощью Intent ACTION_MANAGE_UNKNOWN_APP_SOURCES:

startActivity(new Intent(android.provider.Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES));

Вы также можете отправить пользователя более конкретно к определенному параметру для вашего приложения, используя:

startActivity(new Intent(android.provider.Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:your.application.package")));
  1. Как я могу предложить пользователю установить указанный.apk?

После того как вы удостоверились, что вам предоставлено соответствующее разрешение, вы можете попросить пользователя установить ваш.apk файл в любом месте вашего кода активности (где this относится к вашему Context активности), используя:

Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setDataAndType(FileProvider.getUriForFile(this, "your.application.package.fileprovider", new File("/path/to/your/apk")), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

startActivity(intent);

Вы также можете добавить intent.putExtra(Intent.EXTRA_RETURN_RESULT, true) и начать с startActivityForResult(Intent, int), если вы хотите узнать, была ли эта установка успешной, было отменено или не выполнено.

Информацию о том, как правильно получить файл.apk Uri, см. В разделе FileProvider.