同样的代码在8.0以下手机上运行无误,但是8.1以及9.0的用户反馈启动白屏。这就奇怪了,我首先断点调试没有发现问题,最后多打了几个断点发现在获取设备信息时抛异常了,断点卡在下面两行。
String device_type = android.os.Build.MODEL; // 手机型号
String release = android.os.Build.VERSION.RELEASE; // android系统版本号
首先,我查询6.0以上危险权限组中有READ_PHONE_STATE,确实出问题的代码中我没有动态授权,但是奇怪的是
CALL_PHONE是我动态给过的,显然并不是给一个就把整组权限都拿到了。
添加了READ_PHONE_STATE之后,经测试无误了。最终代码如下:
(1)实现接口 implements OnRequestPermissionsResultCallback
(2)授权
private void checkPermissioin(){
int checkStorage = ContextCompat.checkSelfPermission(LoginActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
int checkCallPhone = ContextCompat.checkSelfPermission(LoginActivity.this, Manifest.permission.CALL_PHONE);
int checkPhoneState = ContextCompat.checkSelfPermission(LoginActivity.this, Manifest.permission.READ_PHONE_STATE);
if (checkStorage == PackageManager.PERMISSION_GRANTED && checkCallPhone == PackageManager.PERMISSION_GRANTED && checkPhoneState == PackageManager.PERMISSION_GRANTED) {
//已经授权
showAlerDialog();
Log.i("---wwy", "检测权限 已授权");
} else {//没有权限
ActivityCompat.requestPermissions(LoginActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CALL_PHONE,Manifest.permission.READ_PHONE_STATE}, 1);//申请授权
Log.i("---wwy", "检测权限 未授权");
}
}
(3)回调
@SuppressLint("Override")
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == 1) {
for(int i=0;i<3;i++){
if (grantResults.length > 0 && grantResults[i] == PackageManager.PERMISSION_GRANTED) {
Log.i("---wwy", "回调权限 已授权1");
} else {
Log.i("---wwy", "回调权限 未授权1");
Toast.makeText(this, "请到系统设置页面手动授予权限", Toast.LENGTH_SHORT).show();
finish();
}
}
showAlerDialog();
}
}
最后提醒大家,如果涉及到限制手机最低版本为6.0以上的或者某一功能需要新的权限,一定要确认是否为危险权限,在清单文件和需要授权的地方都要加上,否则会出现一些功能异常还不好定位。