拍照并保存到内部存储并获取getUriForFile的错误

时间:2018-04-27 14:09:27

标签: android android-camera android-fileprovider android-storage

所以我正在开发一个应用程序,我正在拍照并尝试将其保存到应用程序内部存储中。我遇到了fileprovider的问题。我已经查看了很多关于堆栈溢出的问题,但是如果可能的话,我想获得更详细的解释。

我也跟着googles示例,它给了我以下错误。 https://developer.android.com/training/camera/photobasics

Failed to find configured root that contains /storage/emulated/0/Android/data/com.myapp.debug/files/Pictures/JPEG_20180427_095752_2090822261.jpg

以下是我每次关注Google示例时的代码。

<provider
        android:name=".application.blinkupregistration.postworkphotos.PostWorkPhotosFileProvider"
        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>

在我的代码中。

Uri photoURI = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", photoFile);

对于上述两个,我还尝试将com.myapp.provider硬编码到权限和getUriForFile方法中。还为getUriForFile方法执行了getpackageName()。但这些并没有太大变化。我认为主要问题是路径。

使用Google的示例

尝试了以下路径
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="post_work_photos" path="Android/data/${applicationId}/files/Pictures" />
</paths>


<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="post_work_photos" path="Android/data/com.myapp/files/Pictures" />
</paths>

每当我将paths.xml更改为以下内容时,我都会这样做。

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="post_work_photos" path="." />
</paths>

但我不明白为什么它适用于这个时期。我也不知道这是不是正确的做法,这是我主要关注的问题。

如果有人可以帮助我,那就太棒了。谢谢。

2 个答案:

答案 0 :(得分:1)

  

使用Google的示例

尝试了以下路径

他们的例子......有问题。

  

但我不明白为什么它适用于这个时期。

因为您说您愿意支持外部存储根目录中的任何内容。

  

我也不知道这是否是正确的做法

您可以使用<external-files-path>

稍微缩小范围
<external-files-path name="post_work_photos" path="." />

现在,您只提供文件所指向的getExternalFilesDir()文件。

答案 1 :(得分:0)

如果您尝试将图片保存到应用的数据文件夹,则应该可以:

Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File image = new File(getApplicationContext().dataDir, "image.jpg");
Uri uriSavedImage = Uri.fromFile(image);
imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
从API级别4开始支持

context.dataDir

  

分配给包的持久数据的默认目录的完整路径。

否则,如果您的工作高于API级别24,则可以在上下文的任何位置调用getFilesDir()。 (活动,服务......)

  

返回文件系统上目录的绝对路径,其中存储使用openFileOutput(String,int)创建的文件。

相关问题