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

Android 5.0及以上版本如何通过Intent发送MMS?代码无法运行求助

嘿,我来帮你搞定Android 5.0+上用Intent发送MMS的问题!之前的代码失效大概率是因为系统版本升级后,在权限要求、Intent参数规范上有了不少变化,下面给你一步步拆解正确的实现方式:

首先处理权限问题(Android 6.0+必备)

Android 6.0引入了动态权限申请机制,发送MMS需要用到SEND_SMS危险权限,必须先申请用户授权,否则代码会直接失效:

private static final int REQUEST_CODE_SEND_SMS = 100;

// 检查并申请权限
private void checkSendSmsPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.SEND_SMS},
                REQUEST_CODE_SEND_SMS);
        return;
    }
    // 权限已授予,执行发送逻辑
    sendMms();
}

// 处理权限申请结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_CODE_SEND_SMS) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            sendMms();
        } else {
            Toast.makeText(this, "需要授予发送短信权限才能发送彩信", Toast.LENGTH_SHORT).show();
        }
    }
}
不带附件的MMS发送实现

Android 5.0+对Intent的参数要求更严格,必须指定收件人Uri,避免使用模糊的Action导致兼容问题:

private void sendMms() {
    String phoneNumber = "1234567890"; // 替换为目标号码
    String mmsContent = "这是一条测试彩信内容";
    String mmsSubject = "彩信主题";

    Intent mmsIntent = new Intent(Intent.ACTION_SENDTO);
    // 必须指定收件人Uri,格式为smsto:号码
    mmsIntent.setData(Uri.parse("smsto:" + phoneNumber));
    // 设置彩信内容和主题
    mmsIntent.putExtra("sms_body", mmsContent);
    mmsIntent.putExtra("subject", mmsSubject);
    // 可选:发送后自动退出短信应用
    mmsIntent.putExtra("exit_on_sent", true);

    // 确保有应用能处理这个Intent,避免崩溃
    if (mmsIntent.resolveActivity(getPackageManager()) != null) {
        startActivity(mmsIntent);
    } else {
        Toast.makeText(this, "未找到可用的短信应用", Toast.LENGTH_SHORT).show();
    }
}
带附件的MMS发送实现(含Android 7.0+适配)

如果要发送带图片、视频的彩信,需要注意Android 7.0+的FileUriExposedException问题,必须用FileProvider生成安全的Content Uri:

第一步:配置FileProvider

在AndroidManifest.xml中添加Provider配置:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

然后在res/xml目录下创建file_paths.xml(如果没有xml目录就新建一个):

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 这里配置你要分享的文件路径,比如外部存储的Pictures目录 -->
    <external-files-path name="my_images" path="Pictures/" />
</paths>

第二步:生成安全Uri并发送彩信

private void sendMmsWithAttachment() {
    String phoneNumber = "1234567890";
    String mmsContent = "这是带图片的彩信";
    // 替换为你要发送的图片文件路径
    File imageFile = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "test.jpg");
    
    // 使用FileProvider生成安全的Content Uri
    Uri imageUri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", imageFile);

    Intent mmsIntent = new Intent(Intent.ACTION_SEND);
    mmsIntent.putExtra("address", phoneNumber);
    mmsIntent.putExtra("sms_body", mmsContent);
    // 设置附件Uri
    mmsIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
    // 根据附件类型设置MIME类型,比如图片是image/jpeg,视频是video/mp4
    mmsIntent.setType("image/jpeg");
    // 必须授予读取Uri的权限,否则短信应用无法访问附件
    mmsIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    // 使用Chooser让用户选择短信应用,提升兼容性
    Intent chooser = Intent.createChooser(mmsIntent, "选择发送彩信的应用");
    if (chooser.resolveActivity(getPackageManager()) != null) {
        startActivity(chooser);
    } else {
        Toast.makeText(this, "未找到可用的短信应用", Toast.LENGTH_SHORT).show();
    }
}
常见坑点排查
  • 权限问题:Android 6.0+必须动态申请SEND_SMS,不要只在Manifest里声明
  • Uri格式错误:不带附件时必须用smsto:开头的Uri,带附件时要确保Uri是Content类型(Android 7.0+)
  • 权限授予:带附件时一定要添加FLAG_GRANT_READ_URI_PERMISSION,否则短信应用无法读取你的附件
  • 兼容性:不同厂商的短信应用对Intent参数支持有差异,尽量用Intent.createChooser避免直接指定包名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:14:47