遍历 DocumentFile 树
Walking a DocumentFile tree
我正在尝试递归遍历 Android 文档文件树,但我无法获得要为子文件夹返回的文件列表。当我在文件夹 URI 上尝试 listFiles() 时,我每次都得到返回的根文件列表。
为什么这不起作用?
package com.example.usbfoldertest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.documentfile.provider.DocumentFile;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "USBFolderTest";
private static final int RQS_OPEN_DOCUMENT_TREE = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, RQS_OPEN_DOCUMENT_TREE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == RESULT_OK && requestCode == RQS_OPEN_DOCUMENT_TREE){
Uri uriTree = data.getData();
Log.d(TAG, "WalkTree: " + uriTree.toString() );
WalkTree( uriTree );
}
super.onActivityResult(requestCode,resultCode,data);
}
private void WalkTree( Uri uriTop ) {
Log.d( TAG, "LoadFileList: " + uriTop.toString() );
DocumentFile documentFile = DocumentFile.fromTreeUri(this, uriTop);
DocumentFile files[] = documentFile.listFiles();
if( files == null ) {
Log.d( TAG, "files is null in LoadFileList()" );
} else {
for( DocumentFile f : files ) {
if( f.isDirectory() ) {
Log.d( TAG, "FOLDER: " + f.getName());
if( f.getName().toLowerCase().contains("lost.dir") ) {
Log.d( TAG, "IGNORE LOST.DIR");
} else {
// Recurse into the folder..
WalkTree( f.getUri() );
}
} else {
Log.d( TAG, "FILE: " + f.getName());
}
}
}
}
}
看来升级文档文件库可以解决问题。我将它添加到我的 build.gradle 并且它现在按预期工作:
implementation 'androidx.documentfile:documentfile:1.0.1'
我正在尝试递归遍历 Android 文档文件树,但我无法获得要为子文件夹返回的文件列表。当我在文件夹 URI 上尝试 listFiles() 时,我每次都得到返回的根文件列表。
为什么这不起作用?
package com.example.usbfoldertest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.documentfile.provider.DocumentFile;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "USBFolderTest";
private static final int RQS_OPEN_DOCUMENT_TREE = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, RQS_OPEN_DOCUMENT_TREE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == RESULT_OK && requestCode == RQS_OPEN_DOCUMENT_TREE){
Uri uriTree = data.getData();
Log.d(TAG, "WalkTree: " + uriTree.toString() );
WalkTree( uriTree );
}
super.onActivityResult(requestCode,resultCode,data);
}
private void WalkTree( Uri uriTop ) {
Log.d( TAG, "LoadFileList: " + uriTop.toString() );
DocumentFile documentFile = DocumentFile.fromTreeUri(this, uriTop);
DocumentFile files[] = documentFile.listFiles();
if( files == null ) {
Log.d( TAG, "files is null in LoadFileList()" );
} else {
for( DocumentFile f : files ) {
if( f.isDirectory() ) {
Log.d( TAG, "FOLDER: " + f.getName());
if( f.getName().toLowerCase().contains("lost.dir") ) {
Log.d( TAG, "IGNORE LOST.DIR");
} else {
// Recurse into the folder..
WalkTree( f.getUri() );
}
} else {
Log.d( TAG, "FILE: " + f.getName());
}
}
}
}
}
看来升级文档文件库可以解决问题。我将它添加到我的 build.gradle 并且它现在按预期工作:
implementation 'androidx.documentfile:documentfile:1.0.1'