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

Android技术问询:如何使用SmsManager.sendMultipartTextMessage发送带图片短信

给短信附加图片的解决方案

嘿,恭喜你已经搞定了多部分文本短信的发送!不过要给短信附加图片的话,你得换个思路——普通的SMS(短信)本身是不支持媒体文件的,你需要的是**MMS(彩信)**来实现这个功能。下面给你两种常用的实现方式:

方法一:调用系统彩信应用(简单快捷)

这种方式不需要自己处理复杂的MMS逻辑,直接调用系统自带的彩信发送界面,让用户完成发送操作,优点是开发成本低,兼容性好:

// 构建发送彩信的Intent
Intent sendMmsIntent = new Intent(Intent.ACTION_SEND);
// 设置收件人号码
sendMmsIntent.putExtra("address", phoneNumber);
// 设置彩信的文本内容
sendMmsIntent.putExtra("sms_body", message);
// 设置要附加的图片URI(可以是本地文件Uri或内容Uri)
sendMmsIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
// 指定媒体类型,根据图片格式调整,比如image/png、image/jpeg
sendMmsIntent.setType("image/jpeg");

// 弹出选择器让用户选择发送应用
startActivity(Intent.createChooser(sendMmsIntent, "发送彩信"));

注意:如果图片来自本地存储,需要申请READ_EXTERNAL_STORAGE权限(Android 13+可以用READ_MEDIA_IMAGES),并且处理动态权限请求。

方法二:手动构建并发送MMS(自定义流程)

如果你需要完全后台处理发送流程,不需要用户手动操作,可以通过ContentResolver操作系统的MMS内容提供者来实现,不过这个方式复杂度更高,且需要处理兼容性问题:

1. 添加必要权限

在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.SEND_MMS" />
<!-- Android 13以下读取本地图片需要 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- Android 13+读取图片需要 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

2. 实现发送代码

public void sendCustomMms(String phoneNumber, String message, Uri imageUri) {
    ContentResolver contentResolver = getContentResolver();

    // 1. 创建彩信会话
    Uri conversationUri = Uri.parse("content://mms-sms/conversations/");
    ContentValues conversationValues = new ContentValues();
    conversationValues.put("address", phoneNumber);
    contentResolver.insert(conversationUri, conversationValues);

    // 2. 创建彩信消息
    Uri mmsUri = Uri.parse("content://mms/");
    ContentValues messageValues = new ContentValues();
    messageValues.put("msg_box", 0); // 0表示待发送状态
    Uri messageUri = contentResolver.insert(mmsUri, messageValues);

    // 3. 添加文本内容部分
    ContentValues textPartValues = new ContentValues();
    textPartValues.put("part_type", "text/plain");
    textPartValues.put("text", message);
    contentResolver.insert(Uri.withAppendedPath(messageUri, "parts"), textPartValues);

    // 4. 添加图片内容部分
    try {
        ContentValues imagePartValues = new ContentValues();
        imagePartValues.put("part_type", "image/jpeg"); // 根据图片格式调整
        // 将图片转换为字节数组
        InputStream inputStream = contentResolver.openInputStream(imageUri);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, length);
        }
        imagePartValues.put("data", outputStream.toByteArray());
        contentResolver.insert(Uri.withAppendedPath(messageUri, "parts"), imagePartValues);

        // 5. 设置发送状态并触发发送
        ContentValues updateValues = new ContentValues();
        updateValues.put("status", -1); // -1表示未发送
        contentResolver.update(messageUri, updateValues, null, null);

        // 发送广播触发系统发送彩信
        Intent sendIntent = new Intent("android.intent.action.SEND_MSG");
        sendIntent.putExtra("uri", messageUri.toString());
        sendBroadcast(sendIntent);

    } catch (IOException e) {
        e.printStackTrace();
        // 处理图片读取异常
    }
}

注意:

  • 不同Android厂商的系统可能对MMS内容提供者的实现有差异,可能需要适配不同设备;
  • 需要处理动态权限请求,确保应用拥有对应的权限;
  • 如果需要监听发送状态,可以通过ContentObserver监听MMS内容的变化。

另外要提醒你,之前用到的SmsManager只能处理纯文本的SMS短信,无法支持MMS的媒体附加功能,所以必须切换到上述MMS的实现方式哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:00:15