android 6.0及以上版本,我们可以发现虽然在AndroidManifest.xml里面,增加
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
这个权限,但是还是无法通过
telephonyManager.getDeviceId()
获取手机设备编号的,那么就需要动态询问用户来获取。
这里给出解决方案:
/**
* 获取设备编号 .
*/
private void getDeviceId()
{
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if(isMarshmallow())
{
if(checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED)
{
GlobalInfo.deviceId = telephonyManager.getDeviceId();
}else
{
requestPermissions(new String[] { Manifest.permission.READ_PHONE_STATE },
PERMISSION_REQUEST_READ_PHONE_STATE);
}
}else
{
GlobalInfo.deviceId = telephonyManager.getDeviceId();
}
}
/**
* isMarshmallow方法.
* @return 是否是安卓23以上
*/
private boolean isMarshmallow() {
return Build.VERSION.SDK_INT >= 23;
}
/**
* 获取权限结果 .
* @param requestCode .
* @param permissions .
* @param grantResults .
*/
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_READ_PHONE_STATE:
if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
getDeviceId();
} else {
//Toast.makeText(this, "权限已被用户拒绝", Toast.LENGTH_SHORT).show();
try {
//另外一种方式获取作为设备编号
String ANDROID_ID = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID);
CPGlobalInfo.terminalPhysicalNo = ANDROID_ID;
CPGlobalInfo.deviceId = ANDROID_ID;
}catch (Exception e)
{
e.printStackTrace();
}
}
break;
default:
break;
}
}
这里是动态获取Manifest.permission.READ_PHONE_STATE,其他一些权限也需要用户手动授权
总结需要用户手动获取的权限:
所属权限组 权限
日历 READ_CALENDAR
日历 WRITE_CALENDAR
相机 CAMERA
联系人 READ_CONTACTS
联系人 WRITE_CONTACTS
联系人 GET_ACCOUNTS
位置 ACCESS_FINE_LOCATION
位置 ACCESS_COARSE_LOCATION
麦克风 RECORD_AUDIO
电话 READ_PHONE_STATE
电话 CALL_PHONE
电话 READ_CALL_LOG
电话 WRITE_CALL_LOG
电话 ADD_VOICEMAIL
电话 USE_SIP
电话 PROCESS_OUTGOING_CALLS
传感器 BODY_SENSORS
短信 SEND_SMS
短信 RECEIVE_SMS
短信 READ_SMS
短信 RECEIVE_WAP_PUSH
短信 RECEIVE_MMS
存储 READ_EXTERNAL_STORAGE
存储 WRITE_EXTERNAL_STORAGE
参考文章: