Android 使用FileProvider从库中拾取图像文件

Android 使用FileProvider从库中拾取图像文件,android,android-gallery,android-fileprovider,Android,Android Gallery,Android Fileprovider,为Android N编译时,我遇到了一个FileProvider的问题。我需要让用户从多媒体资料中选择图像/使用相机拍照,然后将其裁剪成方形 我已经成功地实现了一个文件提供程序,用于使用相机拍摄图像,但我在从多媒体资料中拾取图像时遇到了严重问题。问题是在图库中有很多来自不同地方的文件,我有一个例外,例如: java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/6133

为Android N编译时,我遇到了一个
FileProvider
的问题。我需要让用户从多媒体资料中选择图像/使用相机拍照,然后将其裁剪成方形

我已经成功地实现了一个
文件提供程序
,用于使用相机拍摄图像,但我在从多媒体资料中拾取图像时遇到了严重问题。问题是在图库中有很多来自不同地方的文件,我有一个例外,例如:

  java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/6133-3766/DCIM/100ANDRO/DSC_0035.JPG
所以问题是,我可以把什么放到file\u path.xml中才能访问
/storage/
中的任何地方。我不能依赖于确切的路径,因为可能有来自WhatsApp和类似应用程序的图片,例如WhatsApp图像获得以下路径:

/storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20160821-WA0000.jpg
我用空路径解决了这个问题:


这类似于
环境。getExternalStorageDirectory()
根据


但仍然无法理解如何处理存储在
/storage/SOME_DIR/
中的图像。请帮忙。

我认为这个问题是基于误解

a的目的是授予(外部应用)对应用程序已控制的文件的访问权限

您将永远无法成功地使用自己的文件提供商访问外部应用程序拥有的文件

如果外部应用选择使用文件提供商授予您访问权限,则由其自行决定

这似乎正是问题所要问的。如果我还没有理解您的问题,请告诉我,但如果我确实理解了,您试图做的事情就行不通。

同意的回答您对问题的描述不是很清楚,但如果您尝试访问另一个应用的内部数据,则您必须具有访问权限

合法属于你的应用程序的文件,用户卸载你的应用程序时应删除这些文件。尽管这些文件在技术上可供用户和其他应用程序访问,因为它们位于外部存储器上,但实际上它们并不能为应用程序之外的用户提供价值。

实际上,我在文档中发现,SDK版本24现在更新了许多方案,并且在使用文件方面有了巨大的变化,从文档中可以看出,file://的问题描述为

在包域之外传递file://uri可能会给接收方留下不可访问的路径。因此,尝试传递file://URI会触发FileUriExposedException。共享私有文件内容的推荐方法是使用FileProvider。 由于安全原因,强烈建议使用Content://而不是file://因此基本上使用ContentProvider而不是FileProvider

下面是一个使用它的简单示例

AndroidMenifest.xml中

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    <application
        ...
        <provider
            android:name="android.support.v4.content.FileProvider"
            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>
    </application>
</manifest> 
现在使用它

Uri photoURI = FileProvider.getUriForFile(MainActivity.this,
        BuildConfig.APPLICATION_ID + ".provider",
        createImageFile());

我从中获取了此信息,请仔细阅读,以便充分理解。希望它能帮助大家。

你的应用程序的MinSDK版本是什么?min是14,target是24如果是19,我认为SAF(存储访问框架)将是你的解决方案。这里展示的演示:还有,与此错误相关的问题太多了。检查此搜索:裁剪的前提是加载位图。位图的预请求是从mediastore上的正确“卷”解析内容。contentResolver工作原理的详细信息因媒体源而异(例如:SD卡vs internalStore vs gallery)。。。请参阅“getBitmap”。。。contentResolve位图示例我正在尝试从图库中选取一张图片并进行裁剪。有些图片起作用,有些图片不起作用。我相信,当我触发PICK intent时,我看到的所有图像都是对我的应用程序授予访问权限的图像,但当我触发crop intent时,我应该授予对这些图像的访问权限。还有一些路径我无法授予访问权限。请小心
createImageFile()
中的代码,因为它应该使用与外部根不同的代码。有关此操作的详细信息,请参阅。
Uri photoURI = FileProvider.getUriForFile(MainActivity.this,
        BuildConfig.APPLICATION_ID + ".provider",
        createImageFile());