Android11三星设备发短信报java.lang.SecurityException uid不匹配怎么办
异常触发原因
这是搭载Android 11系统的三星设备独有的ROM定制bug,三星修改了原生SmsManager的权限校验逻辑,在调用getSmsManagerForSubscriptionId()获取指定SIM卡对应的SmsManager实例发送短信时,系统错误地要求当前应用的UID必须和系统短信进程com.android.phone的UID一致,二者本身属于不同的进程,UID天然不匹配,最终就会抛出该安全异常。
原生Android系统不存在这层错误的校验逻辑,其他品牌的Android 11设备、三星非Android 11版本的设备都不会触发该问题。
可行解决方案
- 通用兼容方案:针对三星Android 11设备规避使用
getSmsManagerForSubscriptionId()接口,降级使用SmsManager.getDefault()获取默认SmsManager实例,走系统默认SIM卡的短信发送逻辑。如果业务需要指定SIM卡发送,可提前引导用户将目标SIM卡设置为系统默认短信SIM卡。 - 异常兜底方案:在短信发送逻辑中添加
SecurityException捕获,捕获到异常后判断当前设备是否为Android 11版本的三星设备,如果匹配则自动切换为SmsManager.getDefault()重新发起短信发送请求,不影响其他正常设备的指定SIM卡发送逻辑。 - 特殊场景方案:如果是系统签名应用或者内部定制应用,可申请
android.permission.MODIFY_PHONE_STATE权限,绕过三星系统的错误UID校验,即可正常使用getSmsManagerForSubscriptionId()接口指定SIM卡发送短信。该权限为系统级权限,普通第三方应用无法通过应用商店上架获取,不建议普通应用使用。
内容的提问来源于stack exchange,提问作者Hiren Patel
相关产品推荐
相关产品推荐

