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