很多文章都有介绍在Service中弹出Dialog的问题,在Service只需要给dialog添加上:ad.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);然后再在AndroidManifest.xml中添加上权限:android.permission.SYSTEM_ALERT_WINDOW,可是实践证明在6.0以上是行不通的。
这是因为在Android 6.0以上这个SYSTEM_ALERT_WINDOW这个权限是非常危险的,在清单文件中不能申请此权限。如果要用的话,会抛出异常:
service使用dialog时抛出异常
获取方法
1.用户手动获取,Settings -> Apps -> Draw over other apps。
2.像有的软件都是自己获取的,比如从google play store下载的facebook,那是因为在play store下载的应用,google认为是受信任的,没有攻击性的,所以从play store下载的应用都是自动获取的。而从其它渠道或方式安装则不能自动获取
用代码指引用户手动获取
只需要在程序适当地方添加:
public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE= 5469;//随机值
public void testPermission() {
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE); } }
result:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
if (Settings.canDrawOverlays(this)) {
// You have permission } }}