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

Android通过WhatsApp发送文本文件失败求助:无报错但发送后闪退

WhatsApp 分享文本文件崩溃问题修复方案

问题根源分析

你的代码存在三个关键问题,导致WhatsApp选择联系人后崩溃:

  1. MIME类型错误:使用plain/*不符合文本文件的标准MIME类型,WhatsApp无法正确识别文件格式
  2. Flags被覆盖:连续调用setFlags()会覆盖之前设置的权限标志,导致WhatsApp没有文件读取权限
  3. Uri暴露风险:直接使用file://Uri在Android 7.0+系统中会触发安全限制,引发WhatsApp内部处理异常

修复后的完整代码

第一步:注册FileProvider(AndroidManifest.xml)

<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>

第二步:创建文件路径配置(res/xml/file_paths.xml)

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path name="cache_files" path="." />
</paths>

第三步:修改Java业务代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    
    // 定位到缓存目录下的test.txt文件
    File targetFile = new File(getCacheDir(), "test.txt");
    // 生成符合系统安全要求的Content Uri
    Uri fileUri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", targetFile);
    
    startShare(this, fileUri);
}

public void startShare(Context context, Uri fileUri) {
    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    // 设置正确的文本文件MIME类型
    shareIntent.setType("text/plain");
    shareIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
    shareIntent.putExtra(Intent.EXTRA_TEXT, "file description");
    
    // 叠加权限和启动标志,避免覆盖
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    shareIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    // 主动给所有可处理分享的应用授予文件读取权限
    List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentActivities(shareIntent, PackageManager.MATCH_DEFAULT_ONLY);
    for (ResolveInfo info : resolveInfos) {
        context.grantUriPermission(info.activityInfo.packageName, fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
    }
    
    ((Activity)context).startActivity(Intent.createChooser(shareIntent, "share with"));
}

关键修复说明

  • 修正MIME类型:改用标准的text/plain类型,确保WhatsApp能正确识别并处理文本文件
  • 修复权限标志:使用addFlags()替代setFlags(),保证读取权限和新任务启动标志同时生效
  • 安全Uri生成:通过FileProvider生成content://格式的Uri,规避Android 7.0+的文件Uri暴露限制
  • 主动授权:遍历所有可处理分享的应用,明确授予文件读取权限,避免WhatsApp因权限不足崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:06:02