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

如何从URL直接发送图片至SMS/MMS?现有代码仅唤起应用

直接从URL发送图片至SMS/MMS的解决方案

你当前的代码通过Intent.ACTION_SEND唤起第三方应用发送MMS,这是Android系统的标准交互方式,但如果要实现无需用户手动操作的直接发送,需要通过系统的MMS内容提供者来完成,以下是具体实现方案:

核心限制说明

Android没有提供公开的直接发送MMS的API,因为MMS发送依赖运营商APN配置、网络状态,且涉及用户隐私,官方默认推荐通过Intent唤起应用完成操作。若必须实现自动发送,可通过操作Telephony.Sms.Mms内容提供者实现,但需处理较多细节。

实现步骤

1. 下载网络图片到本地

MMS要求使用本地文件Uri,无法直接引用网络URL,需先将图片下载到应用私有目录:

private suspend fun downloadImage(url: String): File? {
    return try {
        val response = OkHttpClient().newCall(Request.Builder().url(url).build()).execute()
        if (!response.isSuccessful) return null
        
        val file = File(context.filesDir, "temp_mms_image.png")
        response.body?.byteStream()?.use { input ->
            file.outputStream().use { output ->
                input.copyTo(output)
            }
        }
        file
    } catch (e: IOException) {
        e.printStackTrace()
        null
    }
}

注:示例用OkHttp实现网络下载,需在协程中执行;也可替换为其他网络库

2. 申请必要权限

在AndroidManifest.xml中声明权限:

<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- Android 10+ 无需WRITE_EXTERNAL_STORAGE,使用应用私有目录即可 -->

运行时需动态申请SEND_SMS和READ_PHONE_STATE权限。

3. 插入MMS数据并触发发送

通过ContentResolver向系统MMS内容提供者插入数据,触发自动发送:

private fun sendMms(phoneNumber: String, imageFile: File, text: String) {
    val context = applicationContext
    val contentResolver = context.contentResolver

    // 插入MMS主记录
    val mmsValues = ContentValues().apply {
        put(Telephony.Sms.Mms.MESSAGE_BOX, Telephony.Sms.Mms.MESSAGE_BOX_OUTBOX)
        put(Telephony.Sms.Mms.SUBJECT, "MMS")
        put(Telephony.Sms.Mms.DATE, System.currentTimeMillis() / 1000)
        put(Telephony.Sms.Mms.READ, 1)
        put(Telephony.Sms.Mms.SEEN, 1)
    }
    val mmsUri = contentResolver.insert(Telephony.Sms.Mms.CONTENT_URI, mmsValues) ?: return
    val mmsId = ContentUris.parseId(mmsUri)

    // 添加收件人信息
    val recipientValues = ContentValues().apply {
        put(Telephony.Sms.Addresses.ADDRESS, phoneNumber)
        put(Telephony.Sms.Addresses.TYPE, Telephony.Sms.Addresses.TYPE_TO)
        put(Telephony.Sms.Addresses.MSG_ID, mmsId)
    }
    contentResolver.insert(Telephony.Sms.Addresses.CONTENT_URI, recipientValues)

    // 添加文本内容
    val textPartValues = ContentValues().apply {
        put(Telephony.Sms.Mms.Part.MSG_ID, mmsId)
        put(Telephony.Sms.Mms.Part.CONTENT_TYPE, "text/plain")
        put(Telephony.Sms.Mms.Part.TEXT, text)
    }
    contentResolver.insert(Telephony.Sms.Mms.Part.CONTENT_URI, textPartValues)

    // 添加图片内容
    val imageUri = FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", imageFile)
    val imageBytes = contentResolver.openInputStream(imageUri)?.readBytes() ?: return

    val imagePartValues = ContentValues().apply {
        put(Telephony.Sms.Mms.Part.MSG_ID, mmsId)
        put(Telephony.Sms.Mms.Part.CONTENT_TYPE, "image/png")
        put(Telephony.Sms.Mms.Part.DATA, imageBytes)
    }
    contentResolver.insert(Telephony.Sms.Mms.Part.CONTENT_URI, imagePartValues)

    // 触发系统发送MMS
    val intent = Intent(Intent.ACTION_SEND, mmsUri)
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    context.startService(intent)
}

4. 配置FileProvider(Android 7+)

在AndroidManifest.xml中注册FileProvider:

<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中定义文件路径:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="temp_images" path="." />
</paths>

注意事项

  • 不同厂商系统可能对MMS自动发送有额外限制,部分设备可能仍需用户确认操作。
  • 必须确保设备已正确配置运营商MMS的APN信息,否则发送会失败。
  • Android 12+ 对权限和ContentResolver操作有更严格限制,需针对性适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:25:02