Caused by: java.lang.SecurityExc
2018-01-18 本文已影响181人
蘑菇v5
【声明:】本文是作者(蘑菇v5)原创,版权归作者 蘑菇v5所有,侵权必究。本文首发在简书。如若转发,请注明作者和来源地址!未经授权,严禁私自转载!
原因:
使用Android Studio
编译项目的时候将app/build.gradle
中的 defaultConfig
设置中的targetSdkVersion
设置为了23
或则大于23
的数值, 这样 Android Studio
在编译的时候会使用 Android 23 API
即Android 6.0
来编译项目,但是,如果你没有给项目加上动态权限请求的话,你的应用在安装到手机的时候将不会获取任何权限。可以去查看应用的应用信息,其中的Permissions
权限列表中所有的权限组都是关闭状态。
解决办法:
如果你需要紧急避免自己的应用继续在Android 6.0
的系统上崩溃,可以将app/build.gradle
中的targetSdkVersion
和compileSdkVersion
设置为22
或以下版本,这样的话,编译出来的app
会在Android 6.0
上以兼容模式运行,可以获取需要的权限,但随着Android 6.0
的普及,我还是推荐大家尽量给项目加上动态权限时的判断以及逻辑处理。
前提:应用在
android6.0
和以上的设备中
具体解决流程:
第一步:在清单配置文件中,添加如下权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
第二步:android6.0
动态申请权限,在代码中动态添加权限:
int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE);
} else {
//TODO
}
第二步:处理相关请求的回调方法(实现onRequestPermissionsResult
接口 )
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_READ_PHONE_STATE:
if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
//TODO
}
break;
default:
break;
}
}
参考链接:
http://stackoverflow.com/questions/33078003/android-6-0-permission-error
http://stackoverflow.com/questions/32742327/neither-user-10102-nor-current-process-has-android-permission-read-phone-state