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

330

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

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

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

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

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

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

Фредерик Швайгер
источник
Попробуйте это может быть работа stackoverflow.com/a/41221852/5488468
Бипин Бхарти

Ответы:

443

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

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

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
Мартин Конечни
источник
12
Он перенаправляет на общие детали экрана приложения. Как можно перейти на экран разрешений приложений. Я не хочу, чтобы оставшийся один клик тоже,
Милинд Мевада
5
@MilindMevada - вы не можете сделать это в данный момент.
Мартин
Могли бы вы отправлять данные из действия настроек в вашу активность с помощью намерений в режиме реального времени? проблема, с которой я сталкиваюсь, заключается в обработке этих данных в вашей деятельности после их отправки из настроек.
ThunderWiring
Это работает при отладке приложения, но вылетает без реальной причины после подписания APK. Ничего очевидного в logcat тоже нет.
JCutting8
181

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

ОБНОВИТЬ:

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

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

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

Томас Р.
источник
Я испытал то же самое и подумал, что может быть обходной путь / другое решение для этого ...: - /
Фредерик Швайгер
Нет, к сожалению, это невозможно по замыслу. Для получения дополнительной информации проверьте это обсуждение в Google+: goo.gl/Wqjjff
Фредерик Швайгер
1
@Mulgard Whatsapp должен использовать targetSdk = "23". Это позволяет приложению запрашивать у пользователя разрешение. Если ваш целевой SDK <23, возможность показать пользователю экран разрешений приложения полезна, однако кажется, что мы можем показать только экран общих настроек приложения.
vman
4
Intent.FLAG_ACTIVITY_NO_HISTORY может иногда вызывать проблемную ситуацию на планшетах, когда на экране настроек отображается всплывающее окно, оно закрывает экран настроек. Простое удаление этого флага решит эту проблему.
Wirling
2
Вы можете одновременно показать тост, инструктирующий пользователя перейти в «Разрешение» (хорошая идея локализовать это сообщение, даже если остальная часть вашего приложения недоступна на языке пользователя)
vgergo
81
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 ожидает какое-то имя для поиска.

singhpradeep
источник
Это буквально то, что ответ с наибольшим количеством голосов. Зачем дублировать это, а не расширять первоначальный ответ ?!
Томас Келлер
1
Спасибо за подробное объяснение.
Дэвид Рефуа
34

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

 startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)));
dgngulcan
источник
Вы можете использовать getActivity (). GetPackageName (), чтобы получить имя пакета в зависимости от того, как настроена ваша сборка.
Кори Рой
15

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

Код

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

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

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

Винь
источник
1
Он просит страницу разрешения
Maveň ツ
10

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

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

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

Ultimo_m
источник
хорошее использование расширений Kotin
Дэвид Джарвис
8

Котлинский стиль.

    startActivity(Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
        data = Uri.fromParts("package", packageName, null)
    })
Sai
источник
5

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

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);
}
Сандип Кумар
источник
3

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

Даниил
источник
3

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);
}
Ник Ковальский
источник
0

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

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

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

Ashish
источник