将相机拍摄的图像存储到应用的私有缓存目录中。

9
我想要从相机中捕获一张图像,并将它保存到私有应用程序缓存目录中。我意识到我必须给相机应用程序写入我的私有目录的权限,因此我添加了FLAG_GRANT_WRITE_URI_PERMISSION标志。
现在的情况是,相机应用程序打开了,我可以拍照,但是当我点击确认按钮时,没有任何反应。相机应用程序仍然处于打开状态,没有日志输出。我猜测这可能是一个权限问题。
private void getCameraImage() {
    try {
        mTmpFile = File.createTempFile("tmp", ".jpg", getCacheDir());
        Uri imgUri = Uri.fromFile(mTmpFile);
        Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        i.putExtra(MediaStore.EXTRA_OUTPUT, imgUri);
        i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        // i.setData(imgUri); // if uncommented, i get an ActivityNotFound Exception
        startActivityForResult(i, REQUEST_CAMERA);
    } catch (IOException e) {
        Log.e(TAG, "getCameraImage()", e);
        Toast.makeText(this, "Something went wrong", Toast.LENGTH_SHORT).show();
    }
}

任何关于如何纠正这个问题的见解?
编辑:
当我将目录更改为公共SD卡时,它就可以正常工作。
mTmpFile = File.createTempFile("tmp", ".jpg", Environment.getExternalStorageDirectory());

感谢您,Simon。

1
如果这是一个权限问题,LogCat 中会显示错误。 - PearsonArtPhoto
不太确定。即使我删除了FLAG_GRANT_WRITE_URI_PERMISSION标志,也没有任何日志输出。也许相机应用程序检查权限,如果无法写入文件,则中止操作。 - SimonSays
1个回答

1

您可以使用http://developer.android.com/reference/android/hardware/Camera.html#takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback)而不是传递Uri来存储图片,并将内容存储在应用程序内存中。从那里,您将能够做任何您想要的事情。

请不要忘记相机应用程序也会使用图库,而图库应用程序不允许检查您的私人目录。


这是一种非常不同的获取图片方式,与我原来想要的方式不同。它实际上并不是对原问题的答案,但仍然可能解决问题。由于我不再在那个应用程序上工作,因此无法测试解决方案,我将继续接受答案 - 它是唯一的答案 :-) - SimonSays
非常感谢您的赞赏,是的,“是的”并不是对您问题的直接回答,但正如您所说,这是唯一的可能性来做一些仅属于您的应用程序而不属于使用媒体的任何其他应用程序的事情。我自己也使用了这种方法... 谢谢 - danysz
该方案已于API 21中被弃用。 - Douglas Fornaro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接