samsung - No se puede agregar la ventana android.view.ViewRoot$W@44da9bc0-permiso denegado para este tipo de ventana
screen overlay samsung (4)
Prefiero this publicación, por ejemplo, pero obtuve el error al agregar viewgroup al objeto windowmanager. He utilizado la misma clase para el Servicio que se ha publicado en la pregunta, sin cambios en los que puedo confundir. No lo obtuve.
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(mView, params); // here
cuando agrego vista a WindowManger
aquí está mi archivo manifiesto
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.searce.testoverlay"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name="TestOverlayActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:enabled="true" android:name=".HUD"></service>
</application>
</manifest>
error
09-27 18:49:23.561: ERROR/AndroidRuntime(653): Uncaught handler: thread main exiting due to uncaught exception
09-27 18:49:23.571: ERROR/AndroidRuntime(653): java.lang.RuntimeException: Unable to create service com.searce.testoverlay.HUD: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRoot$W@44da9bc0 -- permission denied for this window type
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2790)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.app.ActivityThread.access$3200(ActivityThread.java:119)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1917)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.os.Handler.dispatchMessage(Handler.java:99)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.os.Looper.loop(Looper.java:123)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.app.ActivityThread.main(ActivityThread.java:4363)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at java.lang.reflect.Method.invokeNative(Native Method)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at java.lang.reflect.Method.invoke(Method.java:521)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at dalvik.system.NativeStart.main(Native Method)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRoot$W@44da9bc0 -- permission denied for this window type
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.view.ViewRoot.setView(ViewRoot.java:492)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at com.searce.testoverlay.HUD.onCreate(HUD.java:41)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2780)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): ... 10 more
" @ ceph3us ¿sabes cómo lograrlo para> = M? ActivityCompat.requestPermissions (esto, nuevo String [] {Manifest.permission.SYSTEM_ALERT_WINDOW} ..."
SYSTEM_ALERT_WINDOW PERMISSION en la API> = 23 (Dibujar sobre otras aplicaciones, etc.):
- ya no aparece en la pantalla de Permisos de la aplicación.
- ni siquiera aparece en la nueva y extrañamente confusa pantalla "Todos los permisos"
Llamar a Activity.requestPermissions () con este permiso,
- no mostrará ningún cuadro de diálogo para que el usuario permita / deniegue.
- en su lugar, se llamará inmediatamente a la devolución de llamada Activity.onRequestPermissionsResult () con un indicador denegado.
Solución:
Si la aplicación se dirige al nivel API 23 o superior, el usuario de la aplicación debe otorgar este permiso explícitamente a la aplicación a través de una pantalla de administración de permisos. La aplicación solicita la aprobación del usuario enviando un intento con la acción ACTION_MANAGE_OVERLAY_PERMISSION . La aplicación puede verificar si tiene esta autorización llamando a Settings.canDrawOverlays ()
código de ejemplo:
/** 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
}
}
}
"¿Y cómo puede el usuario deshabilitar este permiso? No aparece en los permisos en configuración-> aplicaciones->" MiAplicación "-> permisos. Además ... cualquier explicación de por qué este permiso es diferente de los otros en el forma en que lo solicitamos? - Anónimo 12 feb a las 21:01 "
Hay un par de permisos que no se comportan como permisos normales y peligrosos. SYSTEM_ALERT_WINDOW y WRITE_SETTINGS son particularmente sensibles, por lo que la mayoría de las aplicaciones no deberían usarlos. Si una aplicación necesita uno de estos permisos, debe declarar el permiso en el manifiesto y enviar un intento solicitando la autorización del usuario. El sistema responde al intento mostrando una pantalla de administración detallada al usuario.
editar II:
Utilicé este código en una actividad que amplía FragmentActivity y obtuve la excepción java.lang.IllegalArgumentException: solo se pueden usar 16 bits inferiores para requestCode porque el código de solicitud utilizado no está en el rango de 0 .. 65535. Puede considerar cambiar su código de solicitud a un valor apropiado - mtsahakis
como dice:
el código de solicitud debe estar en el rango de 0 .. 65535 .
esto es porque:
- entero en java está representado por 32 bits
- se le permite usar 16 bits más bajos para requestCode
- otros bits se usan en el procesamiento de solicitud
así por ejemplo:
integer value: 5463 ///hi 16 bits // | // lo 16 bits //
as binary string will look like: 0000 0000 0000 0000 0001 0101 0101 0111
código de uso simple en un rango dado
Después de la respuesta de ceph3us para agregar un ceph3us diálogo de alertas, esto funcionó bien
final AlertDialog dialog = dialogBuilder.create();
final Window dialogWindow = dialog.getWindow();
final WindowManager.LayoutParams dialogWindowAttributes = dialogWindow.getAttributes();
// Set fixed width (280dp) and WRAP_CONTENT height
final WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(dialogWindowAttributes);
lp.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 280, getResources().getDisplayMetrics());
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
dialogWindow.setAttributes(lp);
// Set to TYPE_SYSTEM_ALERT so that the Service can display it
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
dialogWindow.setType(WindowManager.LayoutParams.TYPE_TOAST);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
dialogWindow.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
{
dialogWindow.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
}
dialog.show();
Pero el uso de TYPE_SYSTEM_ALERT podría desencadenar la política de eliminación de Google de las aplicaciones que usan permisos peligrosos. Asegúrese de tener una justificación válida en caso de que google lo requiera.
Intenta usar este permiso en AndroidManifest.
android.permission.SYSTEM_ALERT_WINDOW
Puede cambiar su SDK objetivo a 22 o menos, luego también funciona en API 23.
Cámbielo en Gradle.Build.