Android中startIntentSenderForResult废弃后的替代方案及报错解决
解决Google Drive授权中ActivityResultLauncher的setIntentSender报错问题
错误原因
你遇到的Cannot resolve method 'setIntentSender' in 'Intent'报错,是因为Intent类本身没有setIntentSender()方法,之前的写法完全错误。正确的方式是通过IntentSenderRequest.Builder构建IntentSenderRequest实例,再传递给ActivityResultLauncher。
修正后的完整代码
1. 保留正确的ActivityResultLauncher定义
private final ActivityResultLauncher<IntentSenderRequest> authorizationLauncher = registerForActivityResult( new ActivityResultContracts.StartIntentSenderForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { // 授权成功,处理结果 try { handleSignInInent(Identity.getAuthorizationClient(this).getAuthorizationResultFromIntent(result.getData())); } catch (IOException | ApiException e) { throw new RuntimeException(e); } } else { // 授权失败或被取消 Log.i("TTTT", "Authorization failed or was canceled"); } } );
2. 修正授权UI启动代码
替换原来错误的launch()调用部分,改成以下写法:
PendingIntent pendingIntent = authorizationResult.getPendingIntent(); try { assert pendingIntent != null; // 用IntentSenderRequest.Builder构建请求对象 IntentSenderRequest intentSenderRequest = new IntentSenderRequest.Builder(pendingIntent.getIntentSender()) .build(); authorizationLauncher.launch(intentSenderRequest); } catch (IntentSender.SendIntentException e) { Log.i("TTTT", "Couldn't start Authorization UI: " + e.getLocalizedMessage()); }
关键改动说明
- 不再直接操作Intent,而是通过
IntentSenderRequest.Builder传入IntentSender来构建符合要求的请求对象 - 完全适配
ActivityResultContracts.StartIntentSenderForResult契约的参数类型(泛型为IntentSenderRequest),避免类型不匹配问题
内容的提问来源于stack exchange,提问作者Darksymphony
相关产品推荐
相关产品推荐

