我想在手机的SD卡上选择一个文件夹。目前我正在这样做:
activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
Log.d(TAG, "Activity result!");
if (result.getResultCode() == Activity.RESULT_OK) {
}
}
});
..
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
activityResultLauncher.launch(intent);
如何从活动中取回文件夹?如果显示另一个活动,该怎么办?如何区分哪个活动结果是哪个活动结果?
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse(String.format("package:%s", getApplicationContext().getPackageName())));
activityResultLauncher.launch(intent);
旧的做事方式对我来说是有意义的(例如,see here与请求代码和意图),但我不明白新的API调用是如何做到这一点的。
1条答案
按热度按时间ax6ht2ek1#
我认为您的困惑是由于使用了错误的合约。
ActivityResultContracts.StartActivityForResult
更多的是用于您有自己的Activity并且希望以自定义的方式启动它并处理结果的情况。在这种情况下,您将在Intent
中返回结果,然后使用activityResult.getData()
获取Intent
并处理它。对于
ACTION_OPEN_DOCUMENT_TREE
,不需要这样做(我不知道Android操作系统会返回什么格式,可能没有文档记录),您可以使用ActivityResultContracts.OpenDocumentTree
。如何从活动中取回文件夹?
切换到使用
ActivityResultContracts.OpenDocumentTree
将允许您定义ActivityResultCallback<Uri>
而不是ActivityResultCallback<ActivityResult>
。然后,您可以像通常那样处理收到的Uri
。如果我显示另一个活动-我如何分辨哪个活动结果是哪个?
如果您要启动另一个Activity,则需要使用不同的
ActivityResultLauncher
(在这种情况下,必须单独调用registerForActivityResult
,并使用其自己的关联回调)。Android操作系统会根据用于启动Activity的启动器来调用正确的回调。