您的位置:首页 > 移动开发 > Android开发

android 6.0 开发中 遇到权限授予方式变更的问题

2016-04-24 00:17 639 查看
代号棉花糖的android 6.0版本中,google对权限加强了控制,不像以前一样直接在AndroidManifest.xml中简单声明一下就可以,而是要在activity中队权限进行请求。

这段时间在写一个弹出对话框的小功能(
AlertDialog
),对着书里面写,几乎没有什么差别,但是总是报错,提示权限授予上有问题

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.hauru.myexperiment4, PID: 17990
java.lang.RuntimeException: Unable to start receiver com.example.hauru.myexperiment4.ForceOfflineReceiver: java.lang.SecurityException: com.example.hauru.myexperiment4 from uid 10058 not allowed to perform SYSTEM_ALERT_WINDOW
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2732)
at android.app.ActivityThread.-wrap14(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.SecurityException: com.example.hauru.myexperiment4 from uid 10058 not allowed to perform SYSTEM_ALERT_WINDOW
at android.os.Parcel.readException(Parcel.java:1599)
at android.os.Parcel.readException(Parcel.java:1552)
at android.view.IWindowSession$Stub$Proxy.addToDisplay(IWindowSession.java:747)
at android.view.ViewRootImpl.setView(ViewRootImpl.java:531)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:310)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
at android.app.Dialog.show(Dialog.java:319)
at com.example.hauru.myexperiment4.ForceOfflineReceiver.onReceive(ForceOfflineReceiver.java:37)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2725)
at android.app.ActivityThread.-wrap14(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)


恰巧手机刷了6.0原声的包,模拟器也是自动下载的6.0,所以当时毫无头绪,调试了好久都没有解决。

再加之有个同学用的6.0的miui运行也没有见到问题,就没有考虑是安卓版本搞的鬼。

后来爬帖子过程中,还是发现6.0权限请求方式发生了变化。

可惜本人英文太渣,刚开始没看懂,后来动手搞了搞,终于解决了这个问题。

在Activity.java中加入请求的代码,这里权限是解决了AlertDialog弹窗的问题。

private static final int REQUEST_CODE = 1;
private  void requestAlertWindowPermission() {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE);
}

@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE) {
if (Settings.canDrawOverlays(this)) {
Log.i("permission", "onActivityResult granted");
}
}
}


之后在初始化函数中调用请求权限函数
requestAlertWindowPermission
即可

参考链接:

stackoverflow

聊一聊Android 6.0的运行时权限
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: