Java Can';在某些设备上,无法获取外部文件路径中文件的内容URI
我的应用程序使用Java Can';在某些设备上,无法获取外部文件路径中文件的内容URI,java,android,android-fileprovider,android-storage,Java,Android,Android Fileprovider,Android Storage,我的应用程序使用FileProvider获取在外部存储器的子目录中创建的文件的内容URI,并向所选相机应用程序授予权限,以便它可以将照片保存到该文件中。它在每台设备和模拟器上都像一个符咒一样工作,除了一个我没有的设备——华为荣誉7(我有该设备的崩溃日志)。我正在努力理解这个问题,并找到解决它的方法 AndroidManifest.xml <provider android:name="android.support.v4.content.FileProvider" andr
FileProvider
获取在外部存储器的子目录中创建的文件的内容URI,并向所选相机应用程序授予权限,以便它可以将照片保存到该文件中。它在每台设备和模拟器上都像一个符咒一样工作,除了一个我没有的设备——华为荣誉7(我有该设备的崩溃日志)。我正在努力理解这个问题,并找到解决它的方法
AndroidManifest.xml
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="<package>.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_paths" />
</provider>
<paths>
<external-files-path name="external_storage" path="" />
</paths>
当我创建一个空文件与相机应用程序共享时,我使用
Context.getExternalFilesDir(null)
获取基本外部目录路径。
它通常返回如下路径:/storage/simulated/0/Android/data//files
与以下内容相同:
Context.getExternalFilesDirs(null)[0]
ContextCompat.getExternalFilesDirs(上下文,null)[0]
/storage/emulated/0/Android/data//files/247/images/ad4b7cd7-8917-43d5-8f6c-69555d76c0e0
然后我调用FileProvider.getUriForFile(上下文“.FileProvider”,file)
正如我所说,它可以在我所有的东西上正常工作,包括模拟器和设备,API19到25
现在,有一个崩溃:
Caused by java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/0123-4567/Android/data/<package>/files/42/images/51e4b571-67e4-4e7d-abb0-0ae921d339f4
at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)
at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)
因此,我的想法是,可能Context.getExternalFilesDir(null)
提供的存储目录与ContextCompat.getExternalFilesDir(Context,null)
索引处的。如果是这样,我将在存储上创建一个文件提供程序不支持的文件
我还发现一些人向谷歌报告了这一限制
你认为这是真正的根本原因吗?或者你还有其他想法吗?我创建了一个空文件与摄像头应用程序共享,
。不要自己创建文件。您只需要创建一个文件名/文件路径。摄像头应用程序将创建文件。根目录,其中包含/storage/0123-4567/Android/data//files/42/images/…
。这不是来自外部存储器的路径,而是微型SD卡的路径。Fileprovider无法提供SD卡上的文件。@greenapps关于文件创建的内容我一直在关注-谢谢你的提示。是的,我知道这是SD卡路径,但它是使用Context.getExternalFilesDir(null)
获得的,我认为这是获得最主要和受支持的外部存储的正确方法。有关如何避免此问题的任何建议?请查看getExternalFilesDirs()。你有两条路吗?哪一个?@greenapps正如我所说,我没有崩溃的设备,所以我无法检查它。我自己的设备可以有两个外部存储目录。第一个:/storage/emulated/0/Android/data//files
(与Context.getExternalFilesDir(null)
相同),第二个可选:/storage//Android/data//files
。我知道第一个是模拟的,而第二个是SD卡。奇怪的是,有问题的设备返回了第二个类似于Context.getExternalFilesDir(null)
,这是文件提供程序不支持的。
} else if (TAG_EXTERNAL_FILES.equals(tag)) {
File[] externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null);
if (externalFilesDirs.length > 0) {
target = externalFilesDirs[0];
}
}