如何在 Android 中使用 androidx.activity.result.contract.ActivityResultContract$同步结果?

How do I use androidx.activity.result.contract.ActivityResultContract$SynchronousResult in Android?

androidx.activity.result.contract.ActivityResultContract$SynchronousResult 的描述说:“An optional method you can implement that can be used to potentially provide a result in lieu of starting an activity.

假设我想请求 permissions.Generally 我必须通过 registerForActivityResult(contract, callback) 声明一个 ActivityResultLauncher,在回调中编写工作逻辑,并在正确的时间启动它。

据我所知,使用 SynchronousResult(),我不必注册 ActivityResultLauncher。我只需要声明一个 ActivityResultContract,然后调用 contract.SynchronousResult() 将阻塞直到结果 return,即用户已决定授予权限。所以我这样写我的代码:

private boolean requestSDCardPermission(){
    if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityResultContracts.RequestMultiplePermissions contract = new ActivityResultContracts.RequestMultiplePermissions();
        Map<String, Boolean> synchronousResult=contract.getSynchronousResult(LBL_CloudDisk_MainActivity.this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}).getValue();
        return synchronousResult.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) && synchronousResult.get(Manifest.permission.READ_EXTERNAL_STORAGE);
    }
    return true;
}

但是当这段代码执行时,由于 getValue() 指向一个空对象,出现了 NullPointerException,在我看来这意味着 SynchronousResult() 没有阻塞并等待结果。那么我该如何正确使用这个方法呢?

据此 exact set of documentation:

Returns: SynchronousResult<O>: the result wrapped in a ActivityResultContract.SynchronousResult or null if the call should proceed to start an activity.

因此,如果您需要调用 launch() 以获得有效结果,预计 getSynchronousResult() 将 return null。当谈到 RequestMultiplePermissions 时,the source code 表示同步结果仅在所有权限都已授予的情况下才 returned。

一般来说,noneActivityResultContract API 旨在由您的应用程序直接调用 - 它们都作为 ActivityResultRegistry 和您应该与之交互的常规 launch。这些会自动做正确的事情,并会在内部调用 getSynchronousResult() 之类的 API,以避免在不需要时启动 activity。您仍应将结果作为回调的一部分进行处理。