android开发之路-报错之获取手机IMEI码
在完成公司提出的新需求后,升级app时发现如果是之前手机已经安装过此app,则在自动下载app后,安装完成可以正常打开app,但是如果是之前没有安装过此app,则安装完成启动app的时候会白屏,并在一会儿过后弹出应用无响应,“关闭应用”和“继续等待”对话框,当然如果选择继续等待还是会继续弹出对话框。
报错之后第一时间寻找错误日志,发现不管是bug上还是android studio只带的log(error)都没有显示错误信息,后来去找Verbose信息,发现在application里面报了一个错,错误信息是:
Caused by: java.lang.SecurityException: getLine1Number: Neither user 10272 nor current process has android.permission.READ_PHONE_STATE or android.permission.READ_SMS.
很显然了,这是一个securityException ,而我的手机是andrid7.0系统。所以肯定是权限问题导致的。而我的代码里面也已经动态获取权限了
String[] mPermissionList = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.READ_LOGS,Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.SET_DEBUG_APP,Manifest.permission.SYSTEM_ALERT_WINDOW,Manifest.permission.WRITE_APN_SETTINGS,Manifest.permission.CAMERA};
if(Build.VERSION.SDK_INT>=23){
String[] mPermissionList = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CALL_PHONE,Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.CAMERA,Manifest.permission.READ_SMS,Manifest.permission.READ_CALL_LOG};
if(Utils.checkPermissionStrings(AppStartNewActivity.this,mPermissionList)){
ActivityCompat.requestPermissions(this,mPermissionList,REQUEST_READ_PHONE_STATE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
doNext(requestCode,grantResults);
}
private void doNext(int requestCode, int[] grantResults) {
if (requestCode == REQUEST_READ_PHONE_STATE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission Granted
uploadData();
} else {
// Permission Denied
startMain();
}
}
}
所以动态获取权限是不行的了
在Stack Overflow上搜索这个错误,大致有两种解决方法,一种是获取动态权限,一直是把targetSdkVersion设置为23以下,这样编译的时候就会兼容6.0以上系统。
于是在build.gradle里面把targetSDKVersion设置为22,再次编译,没有问题了。