Как программно открыть экран разрешения для определенного приложения на 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);
}