在使用ActivityResultContracts.CreateDocument启动系统文件选择器时,onActivityResult的回调函数中没有调用onResult,因此无法获得所选文件的Uri。解决方法是在启动ActivityResultContracts.CreateDocument时,将返回的Uri保存在一个变量中,并在onActivityResult回调函数中手动调用onResult方法。
以下是示例代码:
private ActivityResultLauncher
private Uri mSelectedDocumentUri;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
mDocumentLauncher = registerForActivityResult(new ActivityResultContracts.CreateDocument(), uri -> {
mSelectedDocumentUri = uri;
// manually call onResult
onDocumentSelected(uri);
});
// start file picker
mDocumentLauncher.launch("my_document.txt");
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data);
if (requestCode == MY_DOCUMENT_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// do nothing, onResult is already called manually
} else {
// handle cancel
}
}
}
private void onDocumentSelected(Uri uri) { // handle selected uri here Log.d(TAG, "Selected document URI: " + uri); }
需要注意的是,在手动调用onResult时需要保证在主线程中执行。