Як програмно відкрити екран дозволу для певного додатка на 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
— Bipin Bharti

Відповіді:


443

Відповідно до офіційного відео з дозволами Marshmallow (у позначці 4m 43s ), ви повинні відкрити сторінку Налаштування програми (звідси це один клік на сторінку Permissions).

Щоб відкрити сторінку налаштувань, ви зробите це

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

12
Він переспрямовує до загальних деталей екрана програми. Як перейти до екрана дозволів додатків. Я не хочу, щоб і цей клік залишився один,
— Milind Mevada

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
Намір.FLAG_ACTIVITY_NO_HISTORY іноді може спричинити проблемну ситуацію на планшетах, коли спливаюче вікно відображається на екрані налаштувань, воно закриє екран налаштувань. Просто усунення цього прапора вирішить це питання.
— Вірлінг

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 очікує пошуку певного імені.


Це буквально те, що відповідає найвищим голосом. Чому дублювати це, а не поширювати оригінальну відповідь ?!
— Томас Келлер

1
Дякую за поглиблене пояснення.
— Девід Рефуа

34

Натомість, ви можете відкрити загальні параметри конкретного додатка одним рядком

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

Ви можете використовувати getActivity (). GetPackageName (), щоб отримати ім'я пакета залежно від налаштування вашої збірки.
— Cory Roy

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

На основі відповіді Мартіна Конечного


приємне використання розширень Котіна
— Девід Джарвіс

7

Стиль Котліна.

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

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

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

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

цей намір полягає в тому, щоб безпосередньо відкрити список малюнків над іншими програмами, щоб керувати дозволами, а потім звідси це одним клацанням миші, щоб отримати доступ до інших додатків Дозволи ... я знаю, це не відповідь, яку ви шукаєте ... але Я роблю це в своїх додатках ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.