如何在Android中使用androidx.activity.result.contract.ActivityResultContract$SynchronousResult?

如何在Android中使用androidx.activity.result.contract.ActivityResultContract$SynchronousResult?,android,onactivityresult,Android,Onactivityresult,描述中说:“您可以实现的可选方法,可用于潜在地提供结果而不是启动活动。” 让我们假设我想要请求权限。通常,我必须通过registerForActivityResult(契约,回调)声明ActivityResultLauncher,在回调中写入工作逻辑,并在正确的时间启动它 据我所知,使用SynchronousResult(),我不必注册ActivityResultLauncher。我只需要声明一个ActivityResultContract,并调用contract.SynchronousResu

描述中说:“
您可以实现的可选方法,可用于潜在地提供结果而不是启动活动。

让我们假设我想要请求权限。通常,我必须通过registerForActivityResult(契约,回调)声明ActivityResultLauncher,在回调中写入工作逻辑,并在正确的时间启动它

据我所知,使用SynchronousResult(),我不必注册ActivityResultLauncher。我只需要声明一个ActivityResultContract,并调用contract.SynchronousResult()将阻止,直到结果返回为止,即用户已决定授予权限。因此,我编写的代码如下:

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;
}
私有布尔请求SDCardPermission(){
if(ContextCompat.checkSelfPermission(getApplicationContext(),Manifest.permission.WRITE\u EXTERNAL\u STORAGE)!=PackageManager.permission\u provided){
ActivityResultContracts.RequestMultiplePermissions合同=新ActivityResultContracts.RequestMultiplePermissions();
Map synchronousResult=contract.getSynchronousResult(LBL_CloudDisk_MainActivity.this,新字符串[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE}).getValue();
返回synchronousResult.get(Manifest.permission.WRITE\u EXTERNAL\u STORAGE)和&synchronousResult.get(Manifest.permission.READ\u EXTERNAL\u STORAGE);
}
返回true;
}
但当执行此代码时,会发生NullPointerException,因为getValue()指向null对象,我认为这意味着SynchronousResult()没有阻塞并等待结果。那么,我应该如何正确地使用这种方法呢?

根据这一点:

返回:
SynchronousResult
:结果包装在
ActivityResultContract中。如果调用应继续启动活动,则返回SynchronousResult
null

因此,如果您需要调用
launch()
以获取有效结果,则
getSynchronousResult()
将返回
null
。当涉及到
RequestMultiplePermissions
时,表示只有在已授予所有权限的情况下才会返回同步结果

一般来说,ActivityResultContractAPI中的无一个是由您的应用程序直接调用的-它们都是作为您应该与之交互的
ActivityResultRegistry
和常规
启动
的一部分调用的。它们会自动做正确的事情,并在内部调用API,如
getSynchronousResult()
,以避免在不需要的情况下启动活动。您仍应将结果作为回调的一部分进行处理