在Oreo中共享文件不起作用

时间:2018-07-01 07:07:41

标签: android file android-intent android-8.0-oreo file-sharing

我正在尝试在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>

1 个答案:

答案 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>