Android分享VCF文件触发android.os.FileUriExposedException异常如何解决?
问题原因
该异常是Android 7.0(API 24)及以上版本的系统强制限制:禁止应用直接向其他应用传递file://格式的URI。你虽然已经配置了FileProvider,但调用分享逻辑时仍使用Uri.fromFile()生成file://格式URI,同时Intent的参数配置也存在错误。
修复步骤
- 替换URI生成逻辑
把Uri.fromFile(vcfFile)替换为FileProvider生成的content://格式URI,注意authorities参数要和AndroidManifest里配置的完全一致:
val contentUri = FileProvider.getUriForFile( this@你的Activity类名, "com.example.testapp.provider", // 必须和manifest中provider的authorities属性值完全相同 vcfFile )
- 修正分享Intent配置
ACTION_SEND类型的Intent传递附件需要使用EXTRA_STREAM参数,同时要给目标应用授予读取URI的临时权限:
val txtIntent = Intent(Intent.ACTION_SEND) txtIntent.type = "text/x-vcard" txtIntent.putExtra(Intent.EXTRA_STREAM, contentUri) // 授予目标应用临时读取该URI的权限,必须添加否则第三方应用无法读取文件 txtIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) startActivity(Intent.createChooser(txtIntent, "Share")) Toast.makeText(this, "Created!", Toast.LENGTH_SHORT).show()
- 可选校验(仍报错时排查)
- 确认
provider_paths.xml存放在res/xml/目录下,文件名、路径无拼写错误 - 确认VCF文件的生成路径确实在外部存储根目录下,和
provider_paths.xml中配置的<external-path name="external_files" path="."/>匹配 - 如果targetSdkVersion >= 33,确认已经申请了对应文件读写权限
内容的提问来源于stack exchange,提问作者Code Chef
相关产品推荐
相关产品推荐

