Совместное использование необработанных ресурсов Android

#android #android-resources #android-fileprovider #android-sharing

#Android #android-ресурсы #android-fileprovider #совместное использование Android

Вопрос:

У меня есть файлы .mp3, .mp4 и .jpg в моих необработанных ресурсах. Я хочу поделиться этими файлами с социальными приложениями. По этой причине я попытался настроить поставщика файлов, но это не сработало.

Манифест:

 <provider
  android:name="androidx.core.content.FileProvider"
  android:authorities="com.my.packagename.fileprovider"
  android:exported="false"
  android:grantUriPermissions="true">
  <meta-data
      android:name="android.support.FILE_PROVIDER_PATHS"
      android:resource="@xml/paths" />
</provider>
 

paths.xml:

 <?xml version="1.0" encoding="utf-8"?>
<paths>

<files-path name="file_path" path="."/>

<external-files-path name="external_path" path="/" />

</paths>
 

Вот как я пытаюсь поделиться файлами (в данном случае аудио):

 File file = new File(mAudio.getSoundUri().getEncodedPath());
Uri soundUri = FileProvider.getUriForFile(
                getContext(),
                "com.my.packagename.fileprovider",
                file);
Intent sharingIntent = new Intent(Intent.ACTION_SEND);
sharingIntent.setType("audio/mp3");
sharingIntent.putExtra(Intent.EXTRA_STREAM, mAudio.getSoundUri());
startActivity(Intent.createChooser(sharingIntent, "Send"));
 

mAudio Объект getSoundUri() возвращает Uri, подобный этому: android.resource://com.my.packagename/raw/sound.mp3

Когда я запускаю это, я либо не получаю никакой ошибки, но намерение не отображается, и моя активность перестраивается, либо я получаю это:

 java.lang.IllegalArgumentException: Failed to find configured root that contains /raw/sound.mp3
 

Я попытался удалить /raw из Uri, но получаю ту же ошибку:

 java.lang.IllegalArgumentException: Failed to find configured root that contains /sound.mp3
 

Почему это происходит?

Ответ №1:

Почему это происходит?

Ресурсы — это файлы на вашем компьютере для разработки. Они не являются файлами на устройстве. На устройстве нет пути к файловой системе для ресурса, и поэтому FileProvider он не может их обслуживать.

Ваши два основных варианта:

  1. Скопируйте ресурсы в файлы (например, в getCacheDir() ), а затем используйте FileProvider для обслуживания файлов
  2. Напишите свой собственный ContentProvider , чтобы напрямую обслуживать необработанные ресурсы (используйте getResources() on a Context для получения Resources объекта, а оттуда вы можете получить InputStream доступ к необработанному ресурсу)

Комментарии:

1. Спасибо за ваш быстрый ответ! Я новичок в программировании на Android, не могли бы вы дать мне пример кода? Просто что-то скетчи, чтобы я мог видеть, что мне нужно делать.

2. @BenceGordos: Этот пример приложения немного устарел и использует ресурсы вместо необработанных ресурсов, но он иллюстрирует основную технику. Это еще более старая версия того же образца , но, как оказалось, она описана в этом бесплатном старом издании одной из моих книг.