Общий доступ к файлам в Oreo не работает - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь поделиться аудиофайлом в 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"));

}

Manifest:

 <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 голосов
/ 01 июля 2018

Если у вас есть приложение, которое обменивается файлами с другими приложениями, использующими Uri, возможно, вы столкнулись с этой ошибкой в ​​API 24 +.

Шаг 1

добавить провайдера в файл манифеста

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

Шаг 2

Создать XML-файл res / xml / provider_paths.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>

Шаг 3

добавить новый код

    File file ; // your code
    Intent install = new Intent(Intent.ACTION_VIEW);
    install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    // Old Approach
    install.setDataAndType(Uri.fromFile(file), mimeType);
    // End Old approach
    // New Approach
    Uri apkURI = FileProvider.getUriForFile(
            context,
            context.getApplicationContext()
                    .getPackageName() + ".provider", file);
    install.setDataAndType(apkURI, mimeType);
    install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    // End New Approach
    context.startActivity(install);
...