studio requestpermissions permission permisos multiple example checkpermission java android android-permissions

java - requestpermissions - Ventana de superposición del sistema Android



request permission android kotlin (5)

Como solución alternativa, puede probar WindowManager.LayoutParams.TYPE_TOAST en lugar de WindowManager.LayoutParams.TYPE_SYSTEM_ALERT. Esto no requiere ningún permiso. Lo estoy usando para mostrar la imagen, tal vez el botón funcionará para

Estoy tratando de crear una superposición del sistema. Pero sigo recibiendo "permiso denegado". Estoy usando SDK versión 23.

Mi archivo de manifiesto:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.test" > <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".activity.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

El código que uso para crear la superposición:

//mView = new HUDView(this); mButton = new Button(this); mButton.setText("Overlay button"); mButton.setOnTouchListener(this); WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT); params.gravity = Gravity.RIGHT | Gravity.TOP; params.setTitle("Load Average"); WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); wm.addView(mButton, params);


En AndroidManifest (para la versión <23)

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE= 5469; //Random value public void testPermission() { 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); } }

Resultado:

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) { if (Settings.canDrawOverlays(this)) { // You have permission } } }


Primero, no hay ningún permiso llamado SYSTEM_OVERLAY_WINDOW . Es SYSTEM_ALERT_WINDOW .

En segundo lugar, si su targetSdkVersion es 23 o superior, y está ejecutando en dispositivos Android 6.0+, su aplicación no obtendrá este permiso desde el principio. Llame a Settings.canDrawOverlays() para ver si tiene el permiso y use ACTION_MANAGE_OVERLAY_PERMISSION para guiar al usuario a la Configuración si no lo tiene.


También puede guiar al usuario a la página de superposición de la aplicación específica. La documentación states :

Entrada: Opcionalmente, el URI de datos del intento puede especificar el nombre del paquete de la aplicación para invocar directamente la GUI de administración específica del nombre del paquete. Por ejemplo "paquete: com.my.app".

Entonces algo como:

intent.setData(Uri.fromParts("package", getPackageName(), null));


para los usuarios que usan Android 8 por debajo o por encima

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; } else { LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE; }