Java 如何在运行KITKAT的设备上使用新的棒棒糖SD卡访问API?
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.2Java 如何在运行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
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();
}
}