Facebook, Evernote, Pocket - все приложения на Android 6.0 получают это разрешение автоматически, даже если они нацелены на 23 ( targetSdkVersion=23
).
О новой модели разрешений Marshmallow было написано много документации. Один из них SYSTEM_ALERT_WINDOW
был «повышен» до «выше опасного» класса разрешений, что требует специального вмешательства пользователя, чтобы приложения были предоставлены с ними. Если у приложения targetSdkVersion
22 или меньше, приложение получает это разрешение автоматически (если запрошено в манифесте).
Однако я заметил, что некоторые приложения получают это разрешение без необходимости отправлять пользователя на специальную страницу настроек Draw over other apps
разрешения. Я видел Facebook, Evernote, Pocket - а может быть, и другие.
Кто-нибудь знает, как приложение может получить это разрешение без прохождения пользователем Settings -> Apps -> Draw over other apps
?
благодаря
Ответы:
Это новое поведение, представленное в Marshmallow 6.0.1 .
Каждое приложение, запрашивающее
SYSTEM_ALERT_WINDOW
разрешение и установленное через Play Store ( требуется версия 6.0.5 или выше), автоматически предоставит разрешение.Если вместо этого приложение загружается неопубликованно, разрешение не предоставляется автоматически. Вы можете попробовать загрузить и установить APK Evernote с apkmirror.com . Как видите, вам нужно вручную предоставить разрешение в
Settings -> Apps -> Draw over other apps
.Это коммиты [1] [2], которые позволяют Play Store автоматически предоставлять
SYSTEM_ALERT_WINDOW
разрешение.источник
above dangerous
фактическим, если вы загружаете приложение неопубликованным образом, разрешение не предоставляется. Только Play Store имеет другое поведение и автоматически предоставляет разрешение, возможно, они думали, что приложения в Play Store не являются вредоносными и им можно доверять. Или, может быть, они получили много жалоб на это изменение и решили найти обходной путь.Да, после выхода Marshmallow Android повысит уровень безопасности, но для
вы можете показать плавающее действие и все, что вы можете заставить пользователя дать разрешение на это, следуя кодам в вашем
onCreate()
методе Поместите этот код после setContentView// Check if Android M or higher if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Show alert dialog to the user saying a separate permission is needed // Launch the settings activity if the user prefers Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); startActivity(myIntent); }
Действие
ACTION_MANAGE_OVERLAY_PERMISSION
непосредственно запускает экран разрешений «Рисовать поверх других приложений».Изменить: мой код выше работает на 100% правильно
Но я только что обнаружил, что многие ребята все еще ищут, как можно разрешить
ACTION_MANAGE_OVERLAY_PERMISSION
постоянно, например, если у пользователя есть разрешение Permission Once, тогда не спрашивайте его каждый раз, когда он открывает приложение, поэтому слушайте решение для вас -Проверьте, есть ли у устройства API 23+
если 23+ API, проверьте, есть ли у пользователя разрешение или нет
если у него было разрешение один раз, не водите его,
Settings.ACTION_MANAGE_OVERLAY_PERMISSION
а если еще не разрешил, попросите проверку разрешения во времяПоместите строку ниже в свой
onCreate()
метод. Поместите это послеsetContentView
checkPermission();
Теперь введите код ниже в
onActivityResult
@TargetApi(Build.VERSION_CODES.M) @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) { if (!Settings.canDrawOverlays(this)) { // You don't have permission checkPermission(); } else { // Do as per your logic } } }
Теперь, наконец, код метода checkPermission
public void checkPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.canDrawOverlays(this)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE); } } }
И не забудьте объявить эту общедоступную переменную в своем классе
public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;
источник
Теперь ( 2019 ), когда Google предлагает альтернативный API
SYSTEM_ALERT_WINDOW
в виде пузырей в Android Q, Google решил в конечном итоге отказаться отSYSTEM_ALERT_WINDOW
в будущей версии Android.И устройства Android Go больше не будут предоставлять это разрешение, т.е.
Settings.canDrawOverlays() == false
источник
Для тех, кто хочет получить это разрешение автоматически при загрузке приложения из Play Store, помимо SYSTEM_ALERT_WINDOW в манифесте, вы должны перейти по этой ссылке и запросить это у Google.
Вы должны предоставить дополнительную информацию, почему вам нужно это разрешение, и Google рассмотрит и автоматически предоставит вам разрешение.
Помните, что прежде чем попросить об этом, вам необходимо:
Иметь разрешение SYSTEM_ALERT_WINDOW в манифесте
Предложить пользователю предоставить разрешение SYSTEM_ALERT_WINDOW в вашем приложении, если оно еще не предоставлено
Если я что-то пропущу, смело обновляйте ответ
источник
Если приложение нацелено на API 22 или ниже, то Play Store предоставит разрешение SYSTEM_ALERT_WINDOW и другие, когда пользователь щелкнет для установки (показывая предупреждение), даже если его устройство - Android 6.0 В противном случае, если приложение нацелено на API 23 или выше, так что разрешение будет запрашиваться во время выполнения.
источник