Android通过Intent发送CSV文件失败问题求助
解决Android分享CSV文件失败的问题
嘿,我来帮你搞定这个CSV文件分享失败的问题!你的代码里有几个关键问题导致文件无法正确附加,我会一步步给你修正,同时解释错误日志里的关键点。
你的代码存在的核心问题
- Uri创建方式错误:直接用
Uri.parse()拼接本地文件路径的方式,在Android 7.0(API 24)及以上版本会触发FileUriExposedException,而且其他应用无法通过file://Uri访问你的应用私有目录下的文件。 - 缺少文件附加逻辑:你没有把文件Uri添加到Intent的
EXTRA_STREAM中,这是ACTION_SEND分享文件必须的核心步骤。 - MIME类型不准确:
text/*虽然能匹配文本类文件,但CSV文件有更精确的MIME类型text/csv,这样目标应用(比如WhatsApp、Gmail)能更准确识别文件类型,避免解析异常。
修正后的完整方案
第一步:配置FileProvider(Android 7.0+必备)
首先在AndroidManifest.xml中添加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>
第二步:创建文件路径配置文件
在res/xml目录下新建file_paths.xml文件(如果没有xml目录就手动创建),内容如下:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="downloads" path="Download" /> </paths>
第三步:修改分享函数
更新你的OpenShare函数,修正Uri处理和Intent配置:
private void OpenShare(String filename) { File file = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), filename); // 用FileProvider获取安全的内容Uri Uri uri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", file); Intent sharingIntent = new Intent(Intent.ACTION_SEND); // 设置CSV对应的精确MIME类型 sharingIntent.setType("text/csv"); // 将文件Uri附加到Intent中 sharingIntent.putExtra(Intent.EXTRA_STREAM, uri); // 授予目标应用临时的Uri读取权限 sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(Intent.createChooser(sharingIntent, "share file with")); }
关于错误日志的说明
Failed to find provider info for cn.teddymobile.free.anteater.den.provider:这个错误来自第三方应用(大概率是某个安全类APP的广告拦截组件),和你的代码完全无关,可以直接忽略。Parcel: Reading a NULL string not supported here以及ANR日志:这些是因为原代码中Uri处理错误,导致分享流程出现异常,修正代码后这些问题会自动消失。
内容的提问来源于stack exchange,提问作者nidhin shiju
相关产品推荐
相关产品推荐

