此弹出窗口是由清单声明的manifest.PERMISSION.SYSTEM_ALERT_WINDOW权限引起的。
开发人员必须注意的3类权限:
普通权限-对它们不执行任何操作,只需在清单中声明即可
脆弱的权限-在清单中声明并在第一时间请求权限。可以通过系统设置进行更改。
以上危险权限:SYSTEM_ALERT_WINDOW和WRITE_SETTINGS属于此类别。必须授予它们,但它们在系统设置中不可见。要请求它,您不需要使用标准方法(int checkSelfPermission(字符串权限)),但是必须适当地检查Settings.canDrawOverlays()或Settings.System.canWrite(),如果不这样做,则会得到类似的异常
无法添加窗口android.view.ViewRootImpl$W@1de28ad-此窗口类型的权限被拒绝
1-您自己在代码中请求此权限,如下所示:
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();
}
}
}