android 如何在没有startActivityForResult的情况下使用ACTION_OPEN_DOCUMENT_TREE?

kb5ga3dv  于 2022-12-02  发布在  Android
关注(0)|答案(1)|浏览(302)

我想在手机的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调用是如何做到这一点的。

ax6ht2ek

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的启动器来调用正确的回调。

相关问题