Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';在某些设备上,无法获取外部文件路径中文件的内容URI_Java_Android_Android Fileprovider_Android Storage - Fatal编程技术网

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];
    }
}