【问题标题】:Taking photo and saving to internal storage and getting error for getUriForFile拍照并保存到内部存储并获取 getUriForFile 错误
【发布时间】:2018-04-28 01:48:23
【问题描述】:

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

我也跟着谷歌的例子,它给了我以下错误。 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 硬编码到 authority 和 getUriForFile 方法中。还为 getUriForFile 方法做了 getpackageName()。但这些并没有太大变化。我认为主要问题是路径。

使用谷歌的例子尝试了以下路径,

<?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>

但我不明白为什么它适用于句号。我也不知道这是否正确,这是我主要关心的问题。

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

【问题讨论】:

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


【解决方案1】:

使用谷歌的例子尝试了以下路径,

他们的例子……有问题。

但我不明白为什么它适用于句号。

因为你是说你愿意支持外部存储根目录内的任何东西。

我也不知道这是否正确

您可以使用&lt;external-files-path&gt; 缩小范围:

<external-files-path name="post_work_photos" path="." />

现在,您只提供来自 getExternalFilesDir() 的文件,这是您的文件指向的位置。

【讨论】:

  • 感谢您的回复。但是由于某种原因,我没有遵循您的意思-“因为您说您愿意支持外部存储根目录中的任何内容。”抱歉,可能只是早上过得很慢。
  • @huey77: &lt;external-path&gt; 映射到外部存储 all 的根目录(即,Environment.getExternalStorageDirectory() 中的所有内容。&lt;external-files-path&gt; 仅映射到特定目录与您的应用绑定的外部存储。
  • 哦,这很有道理。非常感谢您的澄清!
【解决方案2】:

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

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);

context.dataDir 从 API 级别 4 开始受支持。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多