@
asdwddd "用 appops 禁用掉了爱奇艺获取手机号,但是直接启动爱奇艺 提示获取手机号,禁用就强制退出,那么选择允许"
这么做的结果是:
Runtime Permission 层面,爱奇艺获得了电话权限,调用 TelephonyManager.getDeviceId()不会直接抛出 SecurityExcaption。
AppOps 层面,爱奇艺没有在调用受这个 OP 管辖的 API(TelephonyManager.getDeviceId())时,返回 null
即爱奇艺不能从这个 API 获取信息
AppOps 具体怎么在这个函数里工作,看源代码
https://android.googlesource.com/platform/frameworks/opt/telephony/+/9eafe27e7974e38a45ba387c03332653c1ecf7dd/src/java/com/android/internal/telephony/PhoneSubInfo.java public String getDeviceId(String callingPackage) {
if (!checkReadPhoneState(callingPackage, "Requires READ_PHONE_STATE")) {
return null;
}
return mPhone.getDeviceId();
}
private boolean checkReadPhoneState(String callingPackage, String message) {
//--->运行时权限在这里,这关过不了则抛出 SerurityException
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.READ_PHONE_STATE, message);
//--->AppOps 管这里,不等于 AppOpsManager.MODE_ALLOWED 则返回 null
return mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(),
callingPackage) == AppOpsManager.MODE_ALLOWED;
}
https://developer.android.com/reference/android/content/Context.html#enforceCallingOrSelfPermission(java.lang.String, java.lang.String)