To wyskakujące okienko jest spowodowane przez uprawnienie manifest.PERMISSION.SYSTEM_ALERT_WINDOW zadeklarowane w manifeście.
Istnieją 3 kategorie uprawnień, o których deweloper musi wiedzieć:
Normalne pozwolenie - nic z nimi nie rób, po prostu zadeklaruj w Manifeście
Uprawnienia podatne na atak - zadeklaruj w Manifest i poproś o pozwolenie za pierwszym razem. Można je zmienić w ustawieniach systemu.
Powyższe niebezpieczne uprawnienia: SYSTEM_ALERT_WINDOW i WRITE_SETTINGS należą do tej kategorii. Muszą być przyznane, ale nie są widoczne w ustawieniach systemu. Aby o to poprosić, nie używasz standardowego sposobu (int checkSelfPermission (uprawnienie String)), ale musisz odpowiednio sprawdzić Settings.canDrawOverlays () lub Settings.System.canWrite (), a jeśli tego nie zrobisz, otrzymasz wyjątek, taki jak
Nie można dodać okna android.view.ViewRootImpl$W@1de28ad - odmowa uprawnień dla tego typu okna
1-Poproś o to pozwolenie samodzielnie w swoim kodzie, tak jak podano poniżej:
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();
}
}
}