问题描述
- Android无法解决permission denied for this window type
-
安卓学者请教各位大哥们:我的代码出现了哪里的问题 当我需要系统弹出一个系统对话框的时候老是报错
代码如下:这是我在Mainfest中注册的内容<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.wangsj.broadcastbestpractice" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19"/> <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".LoginActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".MainActivity"> </activity> <receiver android:name=".ForceOfflineReceiver"> <intent-filter> <action android:name="com.example.broadcastbestpractice.FORCE_OFFLINE"/> </intent-filter> </receiver> </application> </manifest>
这是我在函数中调用系统对话框的的代码
public class ForceOfflineReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, Intent intent) { AlertDialog.Builder dialogBulider = new AlertDialog.Builder(context); dialogBulider.setTitle("Warning"); dialogBulider.setMessage("You are forced to be offline . Please try login again"); dialogBulider.setCancelable(false); dialogBulider.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityCollector.finishAll(); Intent intent = new Intent(context, LoginActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } }); AlertDialog alertDialog = dialogBulider.create(); alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); alertDialog.show(); } }
我的模拟器用的是android6.0 api用的是23 我已经仔细核对了代码与《第一行代码》中的代码完全相同,为什么我的不能运行成功求解释。新人c币不多,请个各位大侠行行好
解决方案
在没有了解6.0的情况下,建议不要使用那么高的版本,关于权限:http://www.w2bc.com/article/android-6-0-runtime-permission
解决方案二:
19以上 推荐是用 toast模式 不要使用TYPE_SYSTEM_ALERT
解决方案三:
android6.0需要申请权限
解决方案四:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.SYSTEM_OVERLAY_WINDOW) != PackageManager.PERMISSION_GRANTED
&& checkSelfPermission(Manifest.permission.SYSTEM_OVERLAY_WINDOW) != PackageManager.PERMISSION_GRANTED) {
String[] permissions = new String[]{Manifest.permission.SYSTEM_ALERT_WINDOW, Manifest.permission.SYSTEM_OVERLAY_WINDOW};
ActivityCompat.requestPermissions(this, permissions, 10);
return;
}
}
重写
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
loge(TAG, "requestCode" + requestCode + "permissions"+ Arrays.toString(permissions)+"grantResults"+Arrays.toString(grantResults));
}
可以看到申请是否成功
解决方案五:
我也是这个问题,你解决了吗?
解决方案六:
要显示出来也很简单,把下面这句话屏蔽了应该就可以了。这句话用的权限级别比较高,一般系统电量提示的那种对话框都用的这种权限。
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);