Как программно открыть экран разрешения для определенного приложения на Android Marshmallow?

У меня вопрос относительно новой версии Android Marshmallow:

Можно ли отображать экран разрешения для конкретного приложения через намерение или что-то подобное?

Экран разрешения Android M

Можно отобразить настройки приложения с помощью следующего кода – существует ли аналоговое решение для прямого открытия экрана разрешения?

startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", getPackageName(), null))); 

Я уже делал некоторые исследования по этому вопросу, но я не смог найти правильное решение – я был бы признателен за каждую помощь!

Согласно официальному видео разрешенному разрешению Marshmallow (на отметке 4 м 43 ), вы должны открыть страницу настроек приложения вместо этого (оттуда он на один клик на странице «Разрешения»).

Чтобы открыть страницу настроек, вы должны сделать

 Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); 

Это невозможно. Я тоже пытался это сделать. Я мог бы выяснить имя пакета и активность, которая будет запущена. Но в конце вы получите исключение безопасности из-за недостающего разрешения, которое вы не можете объявить.

ОБНОВИТЬ:

Что касается другого ответа, я также рекомендую открыть экран настроек приложения. Я делаю это со следующим кодом:

  public static void startInstalledAppDetailsActivity(final Activity context) { if (context == null) { return; } final Intent i = new Intent(); i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); i.addCategory(Intent.CATEGORY_DEFAULT); i.setData(Uri.parse("package:" + context.getPackageName())); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); context.startActivity(i); } 

Поскольку я не хочу иметь это в своем стеке истории, я удаляю его с помощью флагов намерения.

 Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); 

Описание

Settings.ACTION_APPLICATION_DETAILS_SETTINGS
Открывает страницу настройки параметров для приложения. Отсюда пользователь должен вручную назначить требуемое разрешение.

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

Uri.fromParts("package", getPackageName(), null)
Подготавливает или создает URI, тогда как getPackageName () – возвращает имя вашего пакета приложений.

intent.setData(uri)
Не забудьте установить это . В противном случае вы получите android.content.ActivityNotFoundException . Поскольку вы настроили свое намерение как Settings.ACTION_APPLICATION_DETAILS_SETTINGS а android ожидает поиска какого-либо имени.

Вместо этого вы можете открыть общие настройки приложения в одной строке

  startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID))); 

Если мы говорим о FLYME OS (Meizu) ТОЛЬКО, есть собственное приложение безопасности с разрешениями.

Чтобы открыть его, используйте следующее намерение:

 public static void openFlymeSecurityApp(Activity context) { Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC"); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.putExtra("packageName", BuildConfig.APPLICATION_ID); try { context.startActivity(intent); } catch (Exception e) { e.printStackTrace(); } } 

По умолчанию BuildConfig – это BuildConfig вашего приложения.

Невозможно прагматично открыть экран разрешения. Вместо этого мы можем открыть экран настроек приложения.

Код

 Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)); startActivity(i); 

Образец вывода

введите описание изображения здесь

Xamarin Forms Android:

 //--------------------------------------------------------- public void OpenSettings() //--------------------------------------------------------- { var intent = new Intent(Android.Provider.Settings.ActionApplicationDetailsSettings, Android.Net.Uri.Parse("package:" + Forms.Context.PackageName)); Forms.Context.StartActivity(intent); } 

Если вы хотите написать меньше кода в Kotlin вы можете сделать это:

 fun Context.openAppSystemSettings() { startActivity(Intent().apply { action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS data = Uri.fromParts("package", packageName, null) }) } 

На основании ответа Мартина Конечни

невозможно прагматически получить разрешение … но плохо предположить, что вы поместите эту строку кода в try {} catch {}, что делает ваше приложение, к сожалению, остановлено … и в области catch сделайте диалоговое окно, которое будет перемещаться по пользователь к небольшому учебнику, чтобы включить рисование по другому разрешению приложений … затем нажмите кнопку «Да», чтобы поместить этот код …

  Intent callSettingIntent= new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); startActivity(callSettingIntent); 

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

Может быть, это поможет вам

 private void openSettings() { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivityForResult(intent, 101); } 

Это возможно с помощью метода requestPermissions

Хотя вы не можете напрямую просмотреть страницу настроек, вы можете изменить права доступа.
Хороший пример:
https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html

Таким образом, вы можете проверить и позвонить

 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, 0); } 
Interesting Posts

C ++ итерации во nested поле struct с boost fusion adapt_struct

Запретить сохранение URL-адресов из определенных доменов в истории Firefox

Как интегрировать AngularUI в AngularJS?

Mac OS X 10.5.8 получает неверный IP-адрес от беспроводного маршрутизатора

Что находится в заголовке объекта java

Конфигурация с именем «по умолчанию» не найдена. Android Studio

objective c – Обнаруживать, когда пользователь меняет настройки уведомлений приложения

AsyncTask и обработка ошибок на Android

Как узнать, какая программа установлена ​​или используется конкретный DLL-файл?

Как можно восстановить внутреннюю ошибку ввода / вывода на жестком диске?

Возврат строки из C # DLL с неуправляемым экспортом в скрипт Inno Setup

Совместное использование одной учетной записи onedrive между двумя учетными записями пользователей на Mac

Pacman ничего не скачивает – Всегда 404

Как получить сеть 1000 Мбит / с с использованием кроссового кабеля

Разница между мостом и шаблоном адаптера

Давайте будем гением компьютера.