gpt4 book ai didi

android - 为什么有些 ContextCompat.getExternalFilesDirs 不可访问?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:14:18 24 4
gpt4 key购买 nike

ContextCompat.getExternalFilesDirs(context, null)说:

Returns absolute paths to application-specific directories on all external storage devices where the application can place persistent files it owns.

例如,运行 Android 5.1.1 的 Huawei Honor 从该方法返回以下内容:

/storage/emulated/0/Android/data/my.package.name/files
/storage/sdcard1/Android/data/my.package.name/files

第二个目录是可移动的sd卡。但是,如果我尝试读取或写入该目录,则会出现异常:android.system.ErrnoException: open failed: EACCES (Permission denied)

该应用确实有 WRITE_EXTERNAL_STORAGE。这在运行 Android 4.4.4 的三星 Galaxy Note 4 上工作得很好。这与Android 6.0的可选权限无关,因为这是在5.1.1上显示的问题。

API 说应用程序可以放置它拥有的持久文件,但事实并非如此。

我也听说过其他设备的报告,包括更现代的三星设备。这仅仅是 OEM 没有正确实现这一点,还是我在 Android 的复杂存储框架中遗漏了什么?

这里有一些代码可以在此设备和一些设备上演示这一点。

File removable = ContextCompat.getExternalFilesDirs(context, null)[1];
if (removable.exists() && removable.canRead() && removable.canWrite()) {
File test = new File(removable, "test");
test.createNewFile(); // Throws the exception mentioned above
}

在该目录中创建、移动、mkdir 文件的任何尝试均失败。

最佳答案

好吧,我将您的代码包装在这个 Activity 中:

package com.commonsware.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

File removable = ContextCompat.getExternalFilesDirs(this, null)[1];
if (removable.exists() && removable.canRead() && removable.canWrite()) {
File test = new File(removable, "test");
try {
test.createNewFile(); // Throws the exception mentioned above
}
catch (IOException e) {
Log.e(getClass().getSimpleName(), "Exception creating file", e);
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
}

它在运行 Android 6.0.1 的华为荣耀 5X 上运行良好:

$ adb shell ls -al /storage/1A30-3598/Android/data/com.commonsware.myapplication/files
-rwxrwx--x u0_a29 sdcard_rw 0 2017-05-03 18:02 test

因此,我猜测这是设备特定的不兼容性。

关于android - 为什么有些 ContextCompat.getExternalFilesDirs 不可访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43767777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com