" @ ceph3us вы знаете, как этого добиться для> = M? ActivityCompat.requestPermissions (this, new String [] {Manifest.permission.SYSTEM_ALERT_WINDOW} ..."
РАЗРЕШЕНИЕ SYSTEM_ALERT_WINDOW на API> = 23 (рисовать поверх других приложений и т. Д.):
- больше не отображается на экране разрешений приложения.
- он даже не появляется на странно запутанном новом экране «Все разрешения»
Вызов Activity.requestPermissions () с этим разрешением,
- не будет отображать диалоговое окно для пользователя «Разрешить / Запретить».
- Вместо этого обратный вызов Activity.onRequestPermissionsResult () будет немедленно вызван с флагом отказа.
Решение:
Если приложение предназначено для уровня API 23 или выше, пользователь приложения должен явно предоставить это разрешение приложению через экран управления разрешениями. Приложение запрашивает одобрение пользователя, отправляяi-е действие ACTION_MANAGE_OVERLAY_PERMISSION .Приложение может проверить, есть ли у него эта авторизация, вызвав Settings.canDrawOverlays ()
пример кода:
/** code to post/handler request for permission */
public final static int REQUEST_CODE = -1010101; *(see edit II)*
public void checkDrawOverlayPermission() {
/** check if we already have permission to draw over other apps */
if (!Settings.canDrawOverlays(Context)) {
/** if not construct intent to request permission */
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
/** request permission via start activity for result */
startActivityForResult(intent, REQUEST_CODE);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
/** check if received result code
is equal our requested code for draw permission */
if (requestCode == REQUEST_CODE) {
/ ** if so check once again if we have permission */
if (Settings.canDrawOverlays(this)) {
// continue here - permission was granted
}
}
}
"И как пользователь может отключить это разрешение?Оно не отображается в разрешениях в настройках-> приложения-> «MyApp» -> разрешения. Кроме того, есть объяснение, почему это разрешение отличается от других тем, как мы его запрашиваем? - Аноним 12 февраляв 21:01 "
Есть несколько разрешений, которые не ведут себя как нормальные и опасные разрешения.SYSTEM_ALERT_WINDOW и WRITE_SETTINGS особенно чувствительны, поэтому большинство приложений не должны их использовать.Если приложению требуется одно из этих разрешений, оно должно объявить разрешение в манифесте и отправить намерение с запросом авторизации пользователя.Система отвечает на намерение, показывая пользователю подробный экран управления.
Специальные разрешения
edit II:
Я использовал этот код в Activity, расширяющей FragmentActivity, и получил исключение java.lang.IllegalArgumentException: можно использовать только младшие 16 битов для requestCode, поскольку используемый код запроса не находится в диапазоне 0 .. 65535. ВыВозможно, стоит изменить код запроса на соответствующее значение.- mtsahakis
как он говорит:
код запроса должен находиться в диапазоне 0 .. 65535 .
это потому что:
- целое число в java представлено 32 битами
- вы можете использовать младшие 16 бит для requestCode
- другие биты используются при обработке запроса
, например:
integer value: 5463 ///hi 16 bits // | // lo 16 bits //
as binary string will look like: 0000 0000 0000 0000 0001 0101 0101 0111
простой код использования в заданном диапазоне
edit III:
для приложений, нацеленных на API AOSP 26 (android oreo / 8+)
Приложения, использующие разрешение SYSTEM_ALERT_WINDOW, больше не могут использовать следующиетипы окон для отображения окон предупреждений над другими приложениями и системными окнами:
TYPE_PHONE
TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_SYSTEM_OVERLAY
TYPE_SYSTEM_ERROR
Вместо этого приложения должны использовать новый тип окна с именем TYPE_APPLICATION_OVERLAY.
TYPE_APPLICATION_OVERLAY
Тип окна: окна наложения приложений отображаются над всеми окнами активности (типы между FIRST_APPLICATION_WINDOW и LAST_APPLICATION_WINDOW), но ниже критических системных окон, таких как строка состояния или IME.
Система может в любое время изменить положение, размер или видимость этих окон, чтобы уменьшить визуальный беспорядок для пользователя и также управлять ресурсами.
Требуется разрешение SYSTEM_ALERT_WINDOW.
Система отрегулирует важность процессов с этим типом окна, чтобы уменьшить вероятность того, что убийца с нехваткой памяти убьет их.В многопользовательских системах отображается только на собственном экране пользователя.
WindowManager.LayoutParams wLp = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
: WindowManager.LayoutParams.TYPE_PHONE;
Window.setAttributes(WindowManager.LayoutParams)