我正在尝试在Oreo中共享音频文件。如果该文件位于设备的内部存储中,则可以正常运行,但如果该文件位于外部存储中,则会崩溃,并给出此异常-android.os.FileUriExposedException。
如何解决此问题:
public void shareSong(SongInfoModel songInfoModel){
Uri uri = Uri.parse("");
File f = new File(songInfoModel.getData());
if(Build.VERSION.SDK_INT<=Build.VERSION_CODES.N_MR1) {
uri = Uri.parse("file://" + f.getAbsolutePath());
}else {
uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", f);
}
Intent share = new Intent(Intent.ACTION_SEND);
share.putExtra(Intent.EXTRA_STREAM, uri);
share.setType("audio/*");
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(Intent.createChooser(share, "Share audio File"));
}
清单:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
答案 0 :(得分:1)
如果您有一个使用Uri与其他应用共享文件的应用,则可能在API 24+上遇到了此错误。
第1步
将提供程序添加到清单文件
Angular CLI: 6.0.7
Node: 8.11.2
OS: linux x64
Angular:
...
Package Version
------------------------------------------------------
@angular-devkit/architect 0.6.7
@angular-devkit/core 0.6.7
@angular-devkit/schematics 0.6.7
@schematics/angular 0.6.7
@schematics/update 0.6.7
rxjs 6.2.0
typescript 2.7.2
第2步
创建XML文件res / xml / provider_paths.xml
<manifest ...>
<application ...>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
</application>
第3步
添加新代码
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>