You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Oreo 8.1 Google API模拟器中Intent发送SMS失效问题

解决Oreo系统中短信Intent无法正常唤起的问题

我来帮你搞定这个问题!你的代码在Android 4-6能正常运行,但到了Oreo(8.1)就失效,核心原因是高版本Android对短信相关Intent的处理逻辑做了调整——你代码里用的vnd.android-dir/mms-sms这个MIME类型,在Oreo及以上系统已经不再是推荐写法,系统没法正确识别这个类型来匹配短信应用,自然就唤起失败了。

修复后的代码方案

直接改用更标准、高版本兼容的短信Intent构造方式就行,用Intent.ACTION_SENDTO配合smsto:格式的Uri,明确告诉系统要唤起短信应用:

public void sendSms(String phone) {
    if(null != phone) {
        // 构造smsto协议的Uri,避免号码里的特殊字符导致解析问题
        Uri smsUri = Uri.parse("smsto:" + Uri.encode(phone));
        Intent i = new Intent(Intent.ACTION_SENDTO, smsUri);
        
        // 如果需要预先填充短信内容,可以加上这行
        // i.putExtra("sms_body", "这里是默认的短信内容");
        
        startActivity(Intent.createChooser(i, getString(R.string.sms)));
    }
}

为什么这样改能解决问题?

  • ACTION_SENDTO是Android官方定义的专门用于发送短信的Intent Action,比ACTION_VIEW更精准,高版本系统对它的兼容性更好;
  • smsto:格式的Uri能直接指定收件人号码,系统可以准确匹配到支持短信功能的应用,不会出现找不到组件的情况。

额外注意事项

  1. 权限检查:虽然通过Intent唤起系统短信应用不需要直接持有SEND_SMS权限,但建议在Manifest里还是声明一下这个权限(不需要动态申请,因为是唤起第三方应用):
<uses-permission android:name="android.permission.SEND_SMS" />
  1. 模拟器问题:Android 8.1的Google API模拟器有时候会默认没有预装完整的系统短信应用,导致Intent找不到可处理的组件。如果修复代码后还是不行,可以尝试安装一个第三方短信应用(比如Google Messages)再测试。

内容的提问来源于stack exchange,提问作者Amani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:08:01