Android:如何获取内容://外部存储PUBLIC目录中文件的URI

我已经跟着 this Google tutorial开始用新的Intent(MediaStore.ACTION_IMAGE_CAPTURE)捕获图像的意图.本教程建议您使用getExternalStoragePublicDirectory的公共目录,这对我的应用程序来说非常有用.但是,他们的例子代替使用getExternalFilesDir.然后通过MediaStore.EXTRA_OUTPUT I have to get a content URI文件的URI传递给意图,因为我想要定位到Android N.在定位N之前,我只会传递一个文件:// URI,而除Google之外的所有人都很高兴.现在在N我开始收到FileUriExposedException,似乎是 not very favorable.

所以,因为我有一个这样的文件

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: Missing android.support.FILE_PROVIDER_PATHS Meta-data

该机构是否正确?如果我必须使用我自己的提供者共享公共文件,那么我可以在我的FILE_PROVIDER_PATHS元数据中指定哪些路径?所有options I can find都是私人目录.

解决方法

TL:DR< external-path name =“MyAppFolder”path =“.” />工作,但它是安全的吗? 您将需要自己制作FileProvider.值得一读 documentation,但这里是一个简短的下载.

正如@CommonsWare所提到的,你需要用你的例子中的MediaStore.AUTHORITY替换为“com.example.fileprovider”,这就是你在清单中定义的权限.

在< application>标签在AndroidManifest中键入以下内容

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.example.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <Meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

你得到的例外是由于没有< Meta-data>标签,链接一个xml文件,其中包含您的FileProvider允许触摸的所有路径.但是,这个文件是我自己一直在努力的.

在您链接的教程结束之后,在Save the Full-size Photo部分的末尾,Google给这个file_paths.xml的示例是:

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

“my_images”将在您的示例中替换为“MyAppFolder”.在Google的这个教训中

The path component corresponds to the path that is returned by getExternalFilesDir() when called with Environment.DIRECTORY_PICTURES. Make sure that you replace com.example.package.name with the actual package name of your app.

…并打字出来让我意识到这并不是指你和我正在寻找的公共Pictures目录.这就解释了为什么使用该路径会产生这种异常:

java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Pictures/MyAppFolder/{filename}.jpg

我会留在这里,以备将来参考,并继续回答您的大问题 – 您可以指定什么路径以允许其他应用与您的应用定位API第24级创建的公共图片目录中的文件进行交互?

正如@CommonsWare所说:“您所需的子目录的详细信息因设备而异”,因此您无法声明public Pictures目录的路径,但是我确实找到了一种方法.

< external-path name =“MyAppFolder”path =“.” />将允许您的FileProvider向其他应用程序(如相机)提供内容URI,然后可以读取并写入其解析的文件. 如果有任何危险或缺点,我很乐意听到他们的意见.

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...