getExternalFilesDir在不同的设备上返回不同的路径

时间:2018-08-18 21:17:22

标签: android

请帮助我解决问题。我的应用程序允许拍照并保存在私人文件夹中。下面,我描述了已完成的步骤(根据官方文档)。

我在AndroidManifest.xml中添加了权限和提供程序

<manifest ...>
    <uses-premission andoird:name="andoird.permission.WRITE_EXTERNAL_STORAGE" />
    ...
    <application ...>
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.company.appname.fileprovider"
            ...>
            <meta-data
                android:name="andoird.support.FILE_PROVIDER_PATHS"
                andoird:resource="@xml/file_paths" />
        </provider>
        ...
    </application>
</manifest>

在file_path.xml中,我添加了必填路径

<paths>
    <external-path
        name="my_images"
        path="Android/data/com.company.appname/file/Pictures" />
</paths>

然后我在请求摄影机许可(kotlin)后运行cameraIntent

fun cameraIntent() {
    var intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    if (intent.resolveActivity(packecgeManager) != null) {
        val prefix = System.currentTimeMillis().toString()
        var suffix = ".jpg"
        val folder = getExternalFilesDir(Environment.DIRECTORY_PICTURES) // (1)
        var file = File.createTempFile(prefix, suffix, folder) // (2)
        var uri = FileProvider.getUriForFile(this, "com.company.appname.fileprovider", file) // (1.1)
        ...
    }
}

最后是问题描述。

(1)该代码有时返回file_path.xml中设置的路径

/storage/emulated/0/Android/data/com.company.appname/file/Pictures/1534529847360260979036.jpg

但有时(Lenovo A6010 / Android 5.0.2 / API 21)

/storage/emulated/0/Android/data/com.company.appname/cache/1534529847360260979036.jpg

(1.1)作为(1)的结果,当结果路径指向“缓存”时,此行代码将引发异常

java.lang.IllegalArgumentException 
Failed to find configured root that contains /data/data/com.company.appname/cache/1534529847360260979036.jpg

因为未在file_path中设置此路径,但是为什么(1)返回此路径?

(2)这行代码有时也会引发异常(HUAWEI ShotX / 5.1.1 / API 22)

java.io.IOException 
open failed: EACCES (Permission denied)

为什么?

PS:我的应用程序的minSdkVersion为21。

1 个答案:

答案 0 :(得分:0)

我通过以下方式更改生成的路径

var folder = getExternalFilesDir(null)
if (folder.path.endsWith("cache")) {
    folder = File(folder.path.replace("cache", "files"))
}
if (!folder.exists()) {
    folder.mkdir()
}
folder = File(folder.path + File.separator + "Pictures")
if (!folder.exists()) {
    folder.mkdir()
}
val file = File.createTempFile(prefix, suffix, folder)
...

我认为这是一个丑陋的解决方案,但我没有其他想法。