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

