Esta ventana emergente es causada por el permiso manifest.PERMISSION.SYSTEM_ALERT_WINDOW declarado por el manifiesto.
Hay 3 categorías de permisos que el desarrollador debe conocer:
Permiso normal: no haga nada con ellos, simplemente declare en el Manifiesto
Permisos vulnerables : declare en Manifest y solicite permiso la primera vez. Se pueden cambiar a través de la configuración del sistema.
Por encima de los permisos peligrosos: SYSTEM_ALERT_WINDOW y WRITE_SETTINGS pertenecen a esta categoría. Deben concederse, pero no están visibles en la configuración del sistema. Para solicitarlo, no usa una forma estándar (int checkSelfPermission (permiso de cadena)) pero debe verificar Settings.canDrawOverlays () o Settings.System.canWrite () adecuadamente y si no lo hace obtendrá una excepción como
No se puede agregar la ventana android.view.ViewRootImpl$W@1de28ad - permiso denegado para este tipo de ventana
1-Solicite este permiso usted mismo en su código como se indica a continuación:
public class MainActivity extends AppCompatActivity {
public final static int REQUEST_CODE = 10000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (checkDrawOverlayPermission()) {
Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
}
}
public boolean checkDrawOverlayPermission() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return true;
}
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE);
return false;
} else {
return true;
}
}
@Override
@TargetApi(Build.VERSION_CODES.M)
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE) {
if (Settings.canDrawOverlays(this)) {
Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
}
}
}