安卓应用MMS仅完成准备未发送问题求助
解决Android MMS仅能准备无法发送的问题
看起来你遇到的问题很典型——SMS能正常发送,但MMS卡在准备阶段完成不了发送。我帮你梳理几个关键的排查点和修复方案:
1. 缺失MMS核心权限
你的Manifest里只申请了SEND_SMS,但发送MMS需要单独的**SEND_MMS权限**,这是最容易忽略的点。赶紧把这个权限添加到Manifest中:
<uses-permission android:name="android.permission.SEND_MMS" />
另外注意:从Android 6.0(API 23)开始,这类权限属于危险权限,不能只靠Manifest声明,必须在调用发送函数前做动态权限申请,否则系统会直接拦截操作。
2. Intent配置错误导致发送流程中断
你当前使用的Intent.ACTION_SEND虽然能唤起彩信编辑界面,但系统可能无法正确识别为MMS发送请求,进而无法触发发送动作。建议做以下调整:
- 改用
Intent.ACTION_SENDTO并指定smsto:的Uri,明确告诉系统这是彩信发送请求 - 将Intent的Type设置为
"vnd.android-dir/mms-sms",这是MMS的标准MIME类型 - 移除重复传入的
attachedFileUri参数(你同时在Intent构造和EXTRA_STREAM里传了,可能造成参数冲突)
3. Android 7.0+的FileUriExposedException问题
从Android 7.0(API 24)开始,直接用Uri.fromFile()访问外部存储文件会触发安全异常,系统会阻止附件加载,这也是MMS无法发送的常见原因。你需要用FileProvider生成安全的Content Uri。
修改后的完整代码示例
第一步:在Manifest中注册FileProvider
<application> ... <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> </application>
第二步:创建FileProvider路径配置文件
在res/xml目录下新建file_paths.xml:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_files" path="."/> </paths>
第三步:修改sendMMS函数
public void sendMMS(String sendTO, String msg) { String filePath = "/storage/emulated/0/Download/alphatest.png"; File attachedFile = new File(filePath); // 先检查并申请必要权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_MMS) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_MMS, Manifest.permission.READ_EXTERNAL_STORAGE}, 1001); return; } Uri attachedFileUri; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // Android 7.0+用FileProvider生成安全Uri attachedFileUri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", attachedFile); } else { // 低版本直接使用文件Uri attachedFileUri = Uri.fromFile(attachedFile); } // 构造正确的MMS发送Intent Intent mmsIntent = new Intent(Intent.ACTION_SENDTO); mmsIntent.setData(Uri.parse("smsto:" + sendTO)); // 指定收件人 mmsIntent.setType("vnd.android-dir/mms-sms"); mmsIntent.putExtra(Intent.EXTRA_STREAM, attachedFileUri); mmsIntent.putExtra("sms_body", msg); // 授予彩信应用临时读取文件的权限 mmsIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); try { startActivity(mmsIntent); } catch (ActivityNotFoundException e) { Toast.makeText(this, "未找到可用的彩信应用", Toast.LENGTH_SHORT).show(); } }
额外测试建议
- 先测试不带附件的纯文本MMS,确认发送流程正常后再添加附件
- 检查设备的移动数据是否开启(MMS依赖移动网络,Wi-Fi环境下可能无法发送)
- 确认收件人号码格式正确(避免多余的空格、括号等符号)
内容的提问来源于stack exchange,提问作者bbbaws
相关产品推荐
相关产品推荐

