前言
前几天做一个小程序,基于Android O,miniSDK版本是Android 5.0
一开始用的Android O的虚拟机和7.1.2的一加3测试没问题
但是发布之后,小伙伴说Android M(6.0) 不给权限死,给了权限反而闪退(我程序启动先加载一个Fragment,而这个fragment需要权限,所以我就设定给了权限加载,不给权限停在一个空白页面啥都不做,所以导致不给权限没啥事,给了权限反而崩溃)
后来发现这是因为在Android M中,给定权限使用以下代码:
if(ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_CALENDAR) ==PackageManager.PERMISSION_DENIED){
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_PHONE_STATE},res);
}
权限请求操作之后去下面代码处理:
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String permissions[], @NonNull int[] grantResults) {
switch (requestCode) {
case 0: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.e("JHH","daozhele");
device_fragment = new Device_Fragment(this);
fragmentTransaction.add(R.id.fragment_main,device_fragment);
old_fragment = device_fragment;
fragmentTransaction.commit();
}
}
}
}
后来发现fragment加载提交报错,原因是状态丢失:
把commit代码改成下面的就好了
fragmentTransaction.commitAllowingStateLoss();