兼容android 6.0以上获取设备编号等权限

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 

参考文章:

https://blog.csdn.net/ygz111111/article/details/80281966

猜你喜欢

转载自blog.csdn.net/figo0423/article/details/95976573