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
相关产品推荐
相关产品推荐

