Cửa sổ bật lên này là do quyền tệp kê khai.PERMISSION.SYSTEM_ALERT_WINDOW được khai báo bởi tệp kê khai.
Đó là 3 loại quyền mà nhà phát triển phải biết:
Quyền bình thường - không làm gì với chúng, chỉ cần khai báo trong Tệp kê khai
Quyền dễ bị tổn thương - khai báo trong Manifest và yêu cầu quyền ở lần đầu tiên. Chúng có thể được thay đổi thông qua cài đặt hệ thống.
Các quyền nguy hiểm trên: SYSTEM_ALERT_WINDOW và WRITE_SETTINGS thuộc danh mục này. Chúng phải được cấp, nhưng không hiển thị trong cài đặt hệ thống. Để yêu cầu nó, bạn không sử dụng một cách tiêu chuẩn (int checkSelfPermission (quyền chuỗi)) mà bạn phải kiểm tra Settings.canDrawOverlays () hoặc Settings.System.canWrite () một cách thích hợp và nếu bạn không làm điều đó, bạn sẽ có ngoại lệ như
Không thể thêm cửa sổ android.view.ViewRootImpl$W@1de28ad - quyền bị từ chối đối với loại cửa sổ này
1-Yêu cầu quyền này bởi chính bạn trong mã của bạn giống như được cung cấp bên dưới:
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();
}
}
}