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;
}