изменить это на
библиотека основная функциональность которого заключается в совместном использовании программно снятых снимков экрана с внешними почтовыми приложениями.Я использую
чтобы выполнить это, что означает, что манифест моей библиотеки содержитFileProvider
тегa <provider>
определяется следующим образом::
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.bugshaker.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
filepaths.xml
Потребитель моей библиотеки имеет приложение, которое само использует
<paths>
<files-path path="bug-reports/" name="bug-reports" />
</paths>
делиться файлами. Я ожидал, что оба провайдера смогут обмениваться файлами, если приложение-потребитель использует следующий манифестFileProvider
тег:<provider>
Эта манифестная запись:
<provider
android:authorities="${applicationId}.fileprovider;${applicationId}.bugshaker.fileprovider"
android:exported="false"
android:grantUriPermissions="true"
android:name="android.support.v4.content.FileProvider"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"
tools:replace="android:resource" />
</provider>
указывает два
власти,Provider
(для обмена файлами приложения) и${applicationId}.fileprovider
(для совместного использования файлов библиотеки);${applicationId}.bugshaker.fileprovider
ссылается на обновленный, который содержит отдельные определения каталогов для файлов, генерируемых приложением, и файлов, генерируемых библиотекой:filepaths.xml
После создания приложения мы подтвердили, что сгенерированный манифест заменил правильные узлы на эти обновленные значения.<paths>
<external-path
name="redacted"
path="" />
<files-path
name="bug-reports"
path="bug-reports/" />
</paths>
Однако, когда приложение, использующее эту конфигурацию, собрано (успешно) и запущено, мы видим сбой при запуске:
Используя отладчик, я вижу, что метод
E: FATAL EXCEPTION: main
Process: com.stkent.bugshakertest, PID: 11636
java.lang.RuntimeException: Unable to get provider android.support.v4.content.FileProvider: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.PackageItemInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
at android.app.ActivityThread.installProvider(ActivityThread.java:5856)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:5445)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5384)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1545)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.PackageItemInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:583)
at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:557)
at android.support.v4.content.FileProvider.attachInfo(FileProvider.java:375)
at android.app.ActivityThread.installProvider(ActivityThread.java:5853)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:5445)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5384)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1545)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
ЗапускаетFileProvider.parsePathStrategy
со строкой полномочийPackageManager.resolveContentProvider
затем возвращает ноль, что приводит к этому NPE."${applicationId}.fileprovider;${applicationId}.bugshaker.fileprovider"
. resolveContentProvider
Если я позвоню вручную
пока пауза в этой инструкции и передать либоresolveContentProvider
или же"${applicationId}.fileprovider"
вместо этого возвращает ненулевое "${applicationId}.bugshaker.fileprovider"
, resolveContentProvider
экземпляр (который, казалось бы, ожидаемый результат).ProviderInfo
Эта разница смущает меня, потому что
элементная документация<provider>
заявляет, что поддерживаются несколько органов:Список одного или нескольких полномочий URI, которые идентифицируют данные, предлагаемые поставщиком контента. Несколько авторитетных источников перечисляются путем разделения их названий точкой с запятой. Чтобы избежать конфликтов, имена авторитетов должны использовать соглашение об именах в стиле Java (например, com.example.provider.cartoonprovider). Как правило, это имя подкласса ContentProvider, который реализует поставщика
Там нет по умолчанию. Должен быть указан хотя бы один орган.
Вопросы
Возможно ли, чтобы одно приложение выставляло с несколькими правами доступа и путями к файлам?FileProvider
Если так, что мне нужно изменить, чтобы это работало?Если нет, есть ли другие способы настроить общий доступ к файлам в моей библиотеке, чтобы избежать конфликтов, таких как этот?Вспомогательные ссылкиОригинальный выпуск GitHubПример приложения, демонстрирующего сбой при запуске«Я вижу, что метод PackageItemInfo.loadXmlMetaData вызывается со строкой полномочий« $ {applicationId} .fileprovider; $ {applicationId} .bugshaker.fileprovider »- вы не предоставляете строку полномочий для