Как программно открыть экран разрешения для определенного приложения на Android Marshmallow?
У меня вопрос относительно новой версии Android Marshmallow:
Можно ли отображать экран разрешения для конкретного приложения через намерение или что-то подобное?
- Широковещательные приемники не работают в Android 6.0 Marshmallow
- Любой способ ссылки на настройки уведомлений Android для моего приложения?
- Android M странные общие предпочтения
- ConnectivityManager getNetworkInfo (int) устарел
- Как мы отличаемся от требований, не требующих ответа, в разрешениях Runtime Android M?
Можно отобразить настройки приложения с помощью следующего кода – существует ли аналоговое решение для прямого открытия экрана разрешения?
startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", getPackageName(), null)));
Я уже делал некоторые исследования по этому вопросу, но я не смог найти правильное решение – я был бы признателен за каждую помощь!
- Ошибка разрешения хранилища в Marshmallow
- Замена приложения «Телефон по умолчанию» на Android 6 и 7 с помощью InCallService
- Android M - проверить разрешение во время выполнения - как определить, проверен ли пользователь «Никогда не спрашивать снова»?
- Как приложение WhiteList в режиме «Доза» Android 6.0
- Как проверить разрешения на гранты во время выполнения?
- Разрешения Android M: запутано в использовании функции shouldShowRequestPermissionRationale ()
- Android M Camera Intent + ошибка разрешения?
- Сообщение Android «Обнаружение экрана», если пользователь пытается предоставить разрешение при показе уведомления
Согласно официальному видео разрешенному разрешению Marshmallow (на отметке 4 м 43 ), вы должны открыть страницу настроек приложения вместо этого (оттуда он на один клик на странице «Разрешения»).
Чтобы открыть страницу настроек, вы должны сделать
Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent);
Это невозможно. Я тоже пытался это сделать. Я мог бы выяснить имя пакета и активность, которая будет запущена. Но в конце вы получите исключение безопасности из-за недостающего разрешения, которое вы не можете объявить.
ОБНОВИТЬ:
Что касается другого ответа, я также рекомендую открыть экран настроек приложения. Я делаю это со следующим кодом:
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); }
Поскольку я не хочу иметь это в своем стеке истории, я удаляю его с помощью флагов намерения.
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 ожидает поиска какого-либо имени.
Вместо этого вы можете открыть общие настройки приложения в одной строке
startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)));
Если мы говорим о 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 вашего приложения.
Невозможно прагматично открыть экран разрешения. Вместо этого мы можем открыть экран настроек приложения.
Код
Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)); startActivity(i);
Образец вывода
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); }
Если вы хотите написать меньше кода в Kotlin
вы можете сделать это:
fun Context.openAppSystemSettings() { startActivity(Intent().apply { action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS data = Uri.fromParts("package", packageName, null) }) }
На основании ответа Мартина Конечни
невозможно прагматически получить разрешение … но плохо предположить, что вы поместите эту строку кода в try {} catch {}, что делает ваше приложение, к сожалению, остановлено … и в области catch сделайте диалоговое окно, которое будет перемещаться по пользователь к небольшому учебнику, чтобы включить рисование по другому разрешению приложений … затем нажмите кнопку «Да», чтобы поместить этот код …
Intent callSettingIntent= new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); startActivity(callSettingIntent);
это намерение состоит в том, чтобы напрямую открыть список ничьих по другим приложениям для управления разрешениями, а затем отсюда один щелчок мышью по другим приложениям. Разрешения … я знаю, что это не тот ответ, который вы ищете … но Я делаю это в своих приложениях …
Может быть, это поможет вам
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); }
Это возможно с помощью метода 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); }