文件提供者错误
FileProvider error
https://developer.android.com/training/camera/photobasics.html
我只想用相机拍照,保存并在 ImageView 中显示。
我按照上面的 android 教程进行操作,但一直收到错误(NullPointerException):
Uri photoURI = FileProvider.getUriForFile(this, "com.example.android.fileprovider", photoFile);
我知道我需要在我的应用清单中配置 FileProvider,并且 "authorities" 必须匹配。我不太明白我应该在 authorities 参数中加入什么。我从教程中复制了所有代码,包括文件 res/xml/file_paths.xml。如有任何问题,请提出。
谢谢!
我终于让它工作了!
请记住将提供者标签放在清单文件中应用程序标签的内部 - 那是我的错误(我的提供者标签在应用程序标签之外),以及您收到此错误的原因,基本上是说找不到提供者的定义。
还要确保 .xml 文件中的路径正确。这是我的版本:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="my_images"
path="Android/data/org.projects.cameraapp/files/Pictures" />
</paths>
当然你必须改变你自己的应用程序的路径。
我实际的 Provider 看起来像这样:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="org.projects.cameraapp.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
同样,您需要在自己的应用程序中更改权限值。
您可以在 GitHub 存储库中查看我最初问题的所有源代码。
我也忘了把<provider>
放在<application>
里面;我错误地把它们放在了我已经修复的同一水平上。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="zm.mytestapplication">
<application
...
android:theme="@style/AppTheme">
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="zm.mytestapplication.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</provider>
</application>
</manifest>
file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="Pictures/zm/" />
</paths>
如果有人像我一样难以获得支持。v4.content.FileProvider你可以用这个代替它。
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.camera.app.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths">
</meta-data>
</provider>
https://developer.android.com/training/camera/photobasics.html
我只想用相机拍照,保存并在 ImageView 中显示。
我按照上面的 android 教程进行操作,但一直收到错误(NullPointerException):
Uri photoURI = FileProvider.getUriForFile(this, "com.example.android.fileprovider", photoFile);
我知道我需要在我的应用清单中配置 FileProvider,并且 "authorities" 必须匹配。我不太明白我应该在 authorities 参数中加入什么。我从教程中复制了所有代码,包括文件 res/xml/file_paths.xml。如有任何问题,请提出。
谢谢!
我终于让它工作了!
请记住将提供者标签放在清单文件中应用程序标签的内部 - 那是我的错误(我的提供者标签在应用程序标签之外),以及您收到此错误的原因,基本上是说找不到提供者的定义。
还要确保 .xml 文件中的路径正确。这是我的版本:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="my_images"
path="Android/data/org.projects.cameraapp/files/Pictures" />
</paths>
当然你必须改变你自己的应用程序的路径。
我实际的 Provider 看起来像这样:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="org.projects.cameraapp.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
同样,您需要在自己的应用程序中更改权限值。
您可以在 GitHub 存储库中查看我最初问题的所有源代码。
我也忘了把<provider>
放在<application>
里面;我错误地把它们放在了我已经修复的同一水平上。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="zm.mytestapplication">
<application
...
android:theme="@style/AppTheme">
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="zm.mytestapplication.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</provider>
</application>
</manifest>
file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="Pictures/zm/" />
</paths>
如果有人像我一样难以获得支持。v4.content.FileProvider你可以用这个代替它。
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.camera.app.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths">
</meta-data>
</provider>