【问题标题】:How to use ACTION_OPEN_DOCUMENT_TREE without startActivityForResult?如何在没有 startActivityForResult 的情况下使用 ACTION_OPEN_DOCUMENT_TREE?
【发布时间】:2022-11-29 04:51:13
【问题描述】:

我想在手机的 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 调用是如何完成的。

【问题讨论】:

    标签: android android-intent onactivityresult


    【解决方案1】:

    我认为你的困惑源于使用了错误的合同。 ActivityResultContracts.StartActivityForResult 更适用于您有自己的活动并且想要启动它并以自定义方式处理结果的情况。在这种情况下,您将在 Intent 中返回结果,然后使用 activityResult.getData() 获取 Intent 并处理它。

    对于 ACTION_OPEN_DOCUMENT_TREE 没有必要这样做(我不知道 Android 操作系统会返回什么格式,它可能没有记录),你可以只使用 ActivityResultContracts.OpenDocumentTree

    如何从活动中取回文件夹?

    切换为使用 ActivityResultContracts.OpenDocumentTree 将允许您定义 ActivityResultCallback&lt;Uri&gt; 而不是 ActivityResultCallback&lt;ActivityResult&gt;。然后您可以像往常一样处理收到的Uri

    如果我显示另一个活动怎么办 - 我怎么知道哪个活动结果是哪个?

    如果您要开始另一项活动,您将使用不同的ActivityResultLauncher(并且必须针对这种情况单独调用registerForActivityResult,并使用其自己的关联回调)。 Android 操作系统负责根据用于启动活动的启动器调用正确的回调。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 2012-06-10
      • 2019-11-15
      • 2013-06-30
      • 2015-08-09
      • 2018-08-21
      • 2017-06-11
      相关资源
      最近更新 更多