使用FileProvider无法正常打开相机并保存图像。获取错误:W / ContextImpl:无法确保目录:

时间:2016-09-08 19:30:06

标签: android camera

我使用以下链接在我的应用中集成相机

  

https://developer.android.com/training/camera/photobasics.html#TaskScalePhoto

我按照每一步操作,但每次尝试从相机拍照时都会出现以下错误,并且会弹出一个对话框,显示“很遗憾,相机已停止。

错误:

  

W / ContextImpl:无法确保目录:/ storage / extSdCard /Android/data/com.example.daf.formvalidator/files/Pictures

     

E / OpenGLRenderer:SFEffectCache:clear(),mSize = 0

对我来说奇怪的是,以下代码(取自上面的链接)在storageDir的值中返回“/ emulated / 0” 以上错误显示“extSdCard”

  

//返回   /storage/emulated/0/Android/data/com.example.daf.formvalidator/files/Pictures /

File storageDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);

我想要什么?

- 开启相机应用程序。

- 将照片存储到应用的专用存储空间,如链接中所述。

- 想要使用FileProvider

我也试过在意图上设置标志,例如:

  

takePictureIntent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

我无法找到问题并花了将近1天的时间来找到问题。 请提供任何形式的帮助。我们将不胜感激。

为什么“storageDir的值”和错误消息之间存在差异?

如果问题不明确,请建议......

3 个答案:

答案 0 :(得分:0)

尝试将此权限添加到您的清单中:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

答案 1 :(得分:0)

如果您使用的是Google开发人员的示例,请尝试将您的文件放入自定义目录:

template <typename Arg1>
void trace(const char* name, Arg1&& arg1){
    cout << name << " : " << arg1 << endl;
}

答案 2 :(得分:0)

所以你想:

  

打开相机应用程序。

     

将拍摄的照片存储到应用的私人存储空间,如链接中所述。

     

想要使用FileProvider

我要提到的第一件事是,您发布的错误根本不是错误。这是一个警告,你应该可以忽略它。我认为这个警告意味着他们无法判断目录是否存在(这与链接有关,我将在一秒钟之内谈论)。你可以为你的例外发布实际的堆栈跟踪吗?听起来这不是你的问题。

从您的帖子中发现的另一件事是,您听起来像是在混淆私人存储空间和SD卡。根据定义,SD卡上的文件不是私有存储。有关您的选项的详细说明,请参阅此处:https://developer.android.com/guide/topics/data/data-storage.html#filesInternal

具体来说,您要注意您正在做的是保存到SD卡,根据定义,它不是内部(或私人)存储。

至于&#34; / storage / emulated / 0 /&#34;之间的区别和&#34; / storage / sdcard /&#34;,它们都应指向同一目录。简短版本是自Android L以来,Android支持多个用户。 &#34;模拟/ 0&#34;只是指向主用户存储目录的链接。我在这里感兴趣的是,通常当我听到&#39;模仿/ 0&#39;它是在内部存储的背景下,但我不明白为什么它不能&#39 ; t也链接到SD卡。