#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
он не может их обслуживать.
Ваши два основных варианта:
- Скопируйте ресурсы в файлы (например, в
getCacheDir()
), а затем используйтеFileProvider
для обслуживания файлов - Напишите свой собственный
ContentProvider
, чтобы напрямую обслуживать необработанные ресурсы (используйтеgetResources()
on aContext
для полученияResources
объекта, а оттуда вы можете получитьInputStream
доступ к необработанному ресурсу)
Комментарии:
1. Спасибо за ваш быстрый ответ! Я новичок в программировании на Android, не могли бы вы дать мне пример кода? Просто что-то скетчи, чтобы я мог видеть, что мне нужно делать.
2. @BenceGordos: Этот пример приложения немного устарел и использует ресурсы вместо необработанных ресурсов, но он иллюстрирует основную технику. Это еще более старая версия того же образца , но, как оказалось, она описана в этом бесплатном старом издании одной из моих книг.