Android应用分享CSV文件至其他应用时提示不支持附件问题排查
解决CSV文件分享时“不支持的附件”错误
问题原因
你直接使用file://格式的URI分享文件,在Android 7.0及以上系统中,出于安全限制,其他应用无法访问这个路径下的文件,因此会抛出“不支持的附件”错误。正确的做法是使用FileProvider生成内容URI来授权其他应用访问文件。
解决方案
1. 在Manifest中配置FileProvider
在<application>标签内添加FileProvider的配置:
<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>
如果使用的是support库,将androidx.core.content.FileProvider替换为android.support.v4.content.FileProvider即可。
2. 创建文件路径配置文件
在res/xml目录下新建file_paths.xml文件(若没有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>
该配置允许FileProvider访问外部存储根目录下的文件,与你代码中Environment.getExternalStorageDirectory()的路径对应。
3. 修改分享代码
将原代码中Uri.parse("file://"+csvFile)的部分替换为FileProvider生成的URI,修改后的完整代码:
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); File csvFile = new File(Environment.getExternalStorageDirectory() + "/SalesManagerBackup/" + "inventoryBackup.csv"); if (!csvFile.exists()) { Toast.makeText(SettingsActivity.this, getResources().getString(R.string.there_is_no_data), Toast.LENGTH_SHORT).show(); } else { Intent intentShare = new Intent(Intent.ACTION_SEND); intentShare.setType("text/csv"); // 使用FileProvider生成内容URI Uri fileUri = FileProvider.getUriForFile(SettingsActivity.this, getPackageName() + ".fileprovider", csvFile); intentShare.putExtra(Intent.EXTRA_STREAM, fileUri); // 授予接收应用临时读取权限 intentShare.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(Intent.createChooser(intentShare, getResources().getString(R.string.share_data_to_other_device))); }
额外注意
- 确保在Android 6.0及以上系统中已经动态申请并获取了
READ_EXTERNAL_STORAGE权限 - 不要依赖
StrictMode设置绕过文件URI限制,这只是临时方案,FileProvider才是合规的解决方式
内容的提问来源于stack exchange,提问作者Muamal Kadhim
相关产品推荐
相关产品推荐

