我跟着this Google tutorial开始意图捕获图像new Intent(MediaStore.ACTION_IMAGE_CAPTURE)
。本教程建议使用公共目录getExternalStoragePublicDirectory
,这对我的应用程序非常有用。但是他们的例子改为使用getExternalFilesDir
。然后传递文件的URI到意图MediaStore.EXTRA_OUTPUT
我have to get a content URI,因为我想定位到Android N之前瞄准N我只是通过一个文件:// URI和每个人,但谷歌很高兴。现在在N我开始得到FileUriExposedException
,似乎是not very favorable。Android:如何获取内容:// URI在外部存储中的文件PUBLIC目录
所以因为我有一个这样的文件...
private File createImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyAppFolder");
if (!storageDir.exists() && !storageDir.mkdir())
Log.w(TAG, "Couldn't create photo folder: " + storageDir.getAbsolutePath());
File image = new File(storageDir, timeStamp + ".jpg");
mCurrentPhotoPath = image.getAbsolutePath();
return image;
}
...我可以使用内置的提供商为公开的图片目录获得内容URI?如果是这样如何?
我已经试过类似
takePictureIntent.putExtra(
MediaStore.EXTRA_OUTPUT,
FileProvider.getUriForFile(this, MediaStore.AUTHORITY, createImageFile()));
,但它只是抛出
抛出:IllegalArgumentException:缺少android.support.FILE_PROVIDER_PATHS元数据
是该单位是否正确?如果我必须使用自己的提供者来共享公共文件,那么我可以在FILE_PROVIDER_PATHS元数据中指定哪条路径?所有options I can find用于私人目录。
“那是正确的权力?” - 不,因为你不是'MediaStore'。 “如果我必须使用我自己的提供者共享公共文件,那么我可以在FILE_PROVIDER_PATHS元数据中指定什么路径?” - ''给你外部存储的根。 'FileProvider'没有办法指定你正在尝试使用的目录。 –
CommonsWare
@CommonsWare如果FileProvider无法使用该目录,那么我是唯一使用私有目录还是停止目标N的选项?这似乎很愚蠢。感谢您的建议。 – Paul
“如果FileProvider无法使用该目录” - 这不是我写的。这就是说,由于你想要的子目录的细节因设备而异,试图使用''会有风险。 “那么我唯一的选择是使用私人目录还是停止定位N?” - 没有。你可以编写你自己的'ContentProvider'。或者,你可以为我的'StreamProvider'编写一个插件。或者,您可以在外部存储上使用自定义目录,您可以从外部存储根目录控制其路径(尽管这可能是“私人目录”的含义)。 –
CommonsWare