Java 如何在运行KITKAT的设备上使用新的棒棒糖SD卡访问API?

Java 如何在运行KITKAT的设备上使用新的棒棒糖SD卡访问API?,java,android,android-sdcard,Java,Android,Android Sdcard,Kit Kat问题无法写入外部SD卡 如中所述,要简化运行KITKAT或更早版本的设备上的代码,可以使用模拟DocumentsProvider行为的fromFile(File) 下面的代码(新API)适用于棒棒糖,但是如何使用新API用于kitkat 也看看 如何使用fromFile(File)? 我尝试过,但说无法创建文件:java.io.IOException:open失败:EACCES(权限被拒绝) 即使在添加了权限之后 使用权限android:name=“android.permissi

Kit Kat问题无法写入外部SD卡

中所述,要简化运行KITKAT或更早版本的设备上的代码,可以使用模拟DocumentsProvider行为的fromFile(File) 下面的代码(新API)适用于棒棒糖,但是如何使用新API用于kitkat

也看看

如何使用fromFile(File)?

我尝试过,但说无法创建文件:java.io.IOException:open失败:EACCES(权限被拒绝)

即使在添加了权限之后 使用权限android:name=“android.permission.WRITE\u外部存储”

安卓版本4.4.2

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);

    DocumentFile pickedDir = DocumentFile.fromFile(new File("/mnt/extSdCard/Test"));

    // List all existing files inside picked directory
    for (DocumentFile file : pickedDir.listFiles()) {
        Log.d("Tag", "Found file " + file.getName() + " with size " + file.length());
    }

    // Create a new file and write into it
    DocumentFile newFile = pickedDir.createFile("text/plain", "My Novel");
    OutputStream out = null;
    try {

        //Says NullPointerException
        out = getContentResolver().openOutputStream(newFile.getUri());                             out.write("A long time ago...".getBytes());
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }        
}

新的API只帮助使用棒棒糖的人向二级SD卡写入数据,而使用KitKat的人仍然是这样

这不会给你任何额外的帮助 对基础文件的访问权限超出了应用程序已有的权限

利用由创建的新权限
您必须使用with返回的Uri

我实际上拥有此权限,但出于某种原因,调用DocumentFile.fromFile(context,file).delete();就我所知,“不给你任何额外的访问权限”仍然适用。如果您已经获得了对完整存储的URI访问权,并且希望使用File->DocumentFile,那么您必须基于您有权访问的树URI进行一些痛苦的URI构建,然后从中创建一个DocumentFile。查看DocumentFile源代码,并查看FilePicker/Helper方法等返回的URI的差异。为什么是这种方式?这个函数不是因为这个而被认为是无用的吗?你的意思是说我需要遍历文件树来完成这个任务?我也觉得这很疯狂,但这是可用的。。。要么遍历树,要么查找AOSP代码,并创建一个函数来构造一个工作文档文件(这是可能的,只是非常粗糙)。只是关于它的许多相关函数已经是一个很好的解决方法。请看一下以下代码:
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);

    DocumentFile pickedDir = DocumentFile.fromFile(new File("/mnt/extSdCard/Test"));

    // List all existing files inside picked directory
    for (DocumentFile file : pickedDir.listFiles()) {
        Log.d("Tag", "Found file " + file.getName() + " with size " + file.length());
    }

    // Create a new file and write into it
    DocumentFile newFile = pickedDir.createFile("text/plain", "My Novel");
    OutputStream out = null;
    try {

        //Says NullPointerException
        out = getContentResolver().openOutputStream(newFile.getUri());                             out.write("A long time ago...".getBytes());
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }        
}