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

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

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

UPDATE:

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

    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);
}

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

Ответ 3

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, и андроид ожидает, что какое-то имя будет искать.

Ответ 4

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

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

Ответ 5

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

Код

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

Пример вывода

enter image description here

Ответ 6

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

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

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

Ответ 7

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

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);
}

Ответ 8

Если мы говорим о 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.

Ответ 9

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);
}

Ответ 10

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

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

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

Ответ 11

Возможно с методом 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);

}