在Android 11中,由于安全限制和权限更改,File.listFiles()不会返回所有文件。相反,您应该使用Storage Access Framework(SAF)来获取文件列表。
以下是使用SAF获取文件列表的示例代码:
private static final int REQUEST_CODE = 42;
private static final String MIME_TYPE = "text/plain";
private void getFiles() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType(MIME_TYPE);
startActivityForResult(intent, REQUEST_CODE);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
super.onActivityResult(requestCode, resultCode, resultData);
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
Uri uri = resultData.getData();
getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String fileName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
// do something with the file
}
cursor.close();
}
}
}
在这个示例中,我们启动了一个SAF Intent来选择所有MIME_TYPE为"text/plain"的文件。一旦用户选择文件,我们会获取文件的URI并请求持久的权限。然后,我们使用该URI查询内容提供程序并遍历结果集来获取选定文件的信息。