最近写项目的时候遇到了这个问题,环信给出的demo里面的targetSdkVersion 是22,但是现在项目一般都需要适配6.0的了,所有在初始化互动云的时候 会报:
java.lang.SecurityException: com.nei.neiquan.huawuyuan was not granted either of these permissions: android.permission.CHANGE_NETWORK_STATE, android.permission.WRITE_SETTINGS.
查了一下资料得出这牵涉到Android 6.0的bug,android 6.0的 :
ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_SETTINGS) != PackageManager.PERMISSION_GRANTED) 不管设置里面有没有允许,这个方法的值都是false,所有这个权限是否有 不能根据这个方法来判断了,找了个替代方法Settings.System.canWrite(context),用这个方法能得到真实的数据,但是这个方法也有一定的局限性,就是得触发下才能有效,返回正确的数据,不然一直是false,就是不管手机系统WRITE_SETTINGS这个权限是否允许,都得按下,如果是允许的,得先按下取消再先允许才能触发onActivityResult,这个里面的Settings.System.canWrite(WelcomeActivity.this)能返回true。所以,我存一个数据在数据库,当进入到主界面的时候就修改这个值,就代表该App已经有这个权限,下次杀死进程进来直接初始化。
在onActivityResult里面判断然后初始化环信 ,具体代码如下:
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("tag", "requestCode==" + requestCode + "resultCode==" + resultCode);
if (requestCode == REQUEST_CODE_WRITE_SETTINGS) {
if (Settings.System.canWrite(WelcomeActivity.this)) {
MyApplication.spUtil.put(UserConstant.ISFIRST2APPpp, "3");
DemoHelper.getInstance().init(this);
settingContent();
}
}
}
问题部分解决,特意记录下,共勉。
java.lang.SecurityException: com.nei.neiquan.huawuyuan was not granted either of these permissions: android.permission.CHANGE_NETWORK_STATE, android.permission.WRITE_SETTINGS.
查了一下资料得出这牵涉到Android 6.0的bug,android 6.0的 :
ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_SETTINGS) != PackageManager.PERMISSION_GRANTED) 不管设置里面有没有允许,这个方法的值都是false,所有这个权限是否有 不能根据这个方法来判断了,找了个替代方法Settings.System.canWrite(context),用这个方法能得到真实的数据,但是这个方法也有一定的局限性,就是得触发下才能有效,返回正确的数据,不然一直是false,就是不管手机系统WRITE_SETTINGS这个权限是否允许,都得按下,如果是允许的,得先按下取消再先允许才能触发onActivityResult,这个里面的Settings.System.canWrite(WelcomeActivity.this)能返回true。所以,我存一个数据在数据库,当进入到主界面的时候就修改这个值,就代表该App已经有这个权限,下次杀死进程进来直接初始化。
在onActivityResult里面判断然后初始化环信 ,具体代码如下:
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("tag", "requestCode==" + requestCode + "resultCode==" + resultCode);
if (requestCode == REQUEST_CODE_WRITE_SETTINGS) {
if (Settings.System.canWrite(WelcomeActivity.this)) {
MyApplication.spUtil.put(UserConstant.ISFIRST2APPpp, "3");
DemoHelper.getInstance().init(this);
settingContent();
}
}
}
问题部分解决,特意记录下,共勉。