Android通过WhatsApp发送文本文件失败求助:无报错但发送后闪退
WhatsApp 分享文本文件崩溃问题修复方案
问题根源分析
你的代码存在三个关键问题,导致WhatsApp选择联系人后崩溃:
- MIME类型错误:使用
plain/*不符合文本文件的标准MIME类型,WhatsApp无法正确识别文件格式 - Flags被覆盖:连续调用
setFlags()会覆盖之前设置的权限标志,导致WhatsApp没有文件读取权限 - 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
相关产品推荐
相关产品推荐

