Android官方Intent短信发送示例无法运行,请求原因解析
问题原因及解决方案
问题根源
ACTION_SENDTO 与 setType() 冲突
ACTION_SENDTO 是专门用于通过 Uri(如smsto:)指定接收方的短信发送 Intent,它不依赖 MIME 类型配置。示例代码中同时设置了ACTION_SENDTO和setType(HTTP.PLAIN_TEXT_TYPE),系统找不到能同时匹配这两个条件的应用,导致resolveActivity()返回 null。未设置目标短信 Uri
ACTION_SENDTO 必须通过setData()传入smsto:开头的 Uri(比如Uri.parse("smsto:")或带具体号码的Uri.parse("smsto:123456")),否则系统无法识别这是指向短信应用的 Intent,自然找不到匹配的 Activity。MMS 场景的 Intent 类型错误
示例代码试图发送带附件的 MMS,但ACTION_SENDTO主要针对纯文本短信。带附件的 MMS 场景下,系统短信应用通常不匹配ACTION_SENDTO,需要改用ACTION_SEND并设置正确的 MIME 类型。Android 11+ 包可见性限制
从 Android 11 开始,应用无法默认查询所有已安装应用。如果清单文件中未声明对短信相关 Intent 的查询权限,resolveActivity()会返回 null。
修正后的代码示例
纯文本短信发送
public void composeSmsMessage(String message, String phoneNumber) { Intent intent = new Intent(Intent.ACTION_SENDTO); // 设置短信接收方Uri,空字符串表示让用户选择 intent.setData(Uri.parse("smsto:" + (TextUtils.isEmpty(phoneNumber) ? "" : phoneNumber))); intent.putExtra("sms_body", message); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
带附件的 MMS 发送
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); // MMS 对应的标准 MIME 类型 intent.setType("application/vnd.android.mms-message"); intent.putExtra("sms_body", message); intent.putExtra(Intent.EXTRA_STREAM, attachment); // 可选:指定接收号码 intent.putExtra("address", "123456"); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
补充:Android 11+ 包可见性配置
在 AndroidManifest.xml 中添加以下查询声明,确保系统能找到匹配的短信应用:
<queries> <!-- 匹配纯文本短信 Intent --> <intent> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="smsto" /> </intent> <!-- 匹配 MMS 发送 Intent --> <intent> <action android:name="android.intent.action.SEND" /> <data android:mimeType="application/vnd.android.mms-message" /> </intent> </queries>
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

