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

MMS发送异常求助:仅发文本未附带Bitmap图片

解决MMS仅发送文本未附带Bitmap的问题

看起来你的MMS发送逻辑里漏掉了几个关键步骤,导致系统只识别成普通SMS而没有带上图片。我帮你梳理下核心问题和对应的解决方案:

1. 核心问题分析

MMS和SMS的触发逻辑本质不同:

  • SMS只需要文本内容,系统会自动走短信通道发送
  • MMS需要明确指定附件资源和正确的Intent类型,否则系统会默认按SMS处理

你的代码大概率没正确配置Intent的类型,或者没有将Bitmap转换为可被MMS识别的Uri附件。

2. 分步解决方案

(1)确保Intent配置正确

发送MMS时,必须将Intent的type设置为图片类型或MMS专属类型,同时指定附件Uri:

  • 推荐使用"image/*"(自动适配图片格式)或"application/vnd.wap.mms-message"(明确指定MMS格式)
  • 绝对不能用"text/plain",否则系统会默认走SMS通道

(2)将Bitmap转换为可访问的Uri

MMS无法直接接收Bitmap对象,必须先将Bitmap保存到本地存储,再通过Uri传递给Intent。Android 10+推荐用MediaStore来保存,避免存储权限问题:

// 保存Bitmap到系统媒体库,返回可共享的Uri
private Uri saveBitmapToMediaStore(Context context, Bitmap bitmap) {
    String fileName = "mms_attachment_" + System.currentTimeMillis() + ".png";
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/png");
    values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/MyAppMMS");

    Uri imageUri = context.getContentResolver().insert(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values
    );

    if (imageUri == null) return null;

    try (OutputStream outputStream = context.getContentResolver().openOutputStream(imageUri)) {
        bitmap.compress(Bitmap.CompressFormat.PNG, 90, outputStream);
    } catch (IOException e) {
        e.printStackTrace();
        // 保存失败时删除空文件
        context.getContentResolver().delete(imageUri, null, null);
        return null;
    }
    return imageUri;
}

(3)构建完整的MMS发送Intent

将文本、号码、图片Uri整合到Intent中,并指定默认短信应用:

public void sendMmsToNumber(Context context, String phoneNumber, String message, Bitmap bitmap) {
    Uri imageUri = saveBitmapToMediaStore(context, bitmap);
    if (imageUri == null) {
        Toast.makeText(context, "图片保存失败,无法发送MMS", Toast.LENGTH_SHORT).show();
        return;
    }

    Intent mmsIntent = new Intent(Intent.ACTION_SEND);
    // 设置MMS类型,确保系统识别为彩信
    mmsIntent.setType("image/*");
    // 接收号码
    mmsIntent.putExtra("address", phoneNumber);
    // 彩信文本内容
    mmsIntent.putExtra("sms_body", message);
    // 添加图片附件
    mmsIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
    // 指定默认短信应用,避免弹出选择对话框
    mmsIntent.setPackage(getDefaultSmsPackage(context));

    if (mmsIntent.resolveActivity(context.getPackageManager()) != null) {
        context.startActivity(mmsIntent);
    } else {
        Toast.makeText(context, "未找到默认短信应用", Toast.LENGTH_SHORT).show();
    }
}

// 获取系统默认短信应用的包名
private String getDefaultSmsPackage(Context context) {
    Intent smsIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"));
    ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(
        smsIntent, PackageManager.MATCH_DEFAULT_ONLY
    );
    return resolveInfo != null ? resolveInfo.activityInfo.packageName : null;
}

(4)检查必要权限

确保你的Manifest中声明了以下权限:

<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.SEND_MMS" />
<!-- Android 10以下需要存储权限,10+用MediaStore无需申请 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />

Android 6+还需要动态申请SEND_SMS和SEND_MMS权限。

3. 额外注意事项

  • 如果要发送给多个号码,将"address"的值设为逗号分隔的字符串(比如"123456,789012")
  • 避免使用Intent.ACTION_VIEW发送带附件的消息,它更适合普通SMS
  • 检查Bitmap是否为空或尺寸过大(部分运营商限制MMS附件大小)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:42:28