如何使用Google一键登录UI替代已废弃的startIntentSenderForResult API
问题背景
从谷歌一键登录Android官方文档复制的代码中,使用了已废弃的startIntentSenderForResult方法,已注册了ActivityResultLauncher但不知道如何替换该废弃方法。
解决方案
你需要将ActivityResultContracts.StartActivityForResult替换为ActivityResultContracts.StartIntentSenderForResult,因为我们要处理的是IntentSender(来自PendingIntent)而非直接的Intent。具体步骤如下:
- 修正ActivityResultLauncher的注册
final ActivityResultLauncher<IntentSenderRequest> oneTapLauncher = registerForActivityResult( new ActivityResultContracts.StartIntentSenderForResult(), result -> { // 处理登录结果,比如解析返回的数据 if (result.getResultCode() == Activity.RESULT_OK) { try { SignInCredential credential = oneTapClient.getSignInCredentialFromIntent(result.getData()); String idToken = credential.getGoogleIdToken(); String username = credential.getId(); String password = credential.getPassword(); // 根据获取到的凭证做后续处理 } catch (ApiException e) { Log.e(TAG, "Sign-in failed: " + e.getLocalizedMessage()); } } } );
- 替换原代码中的startIntentSenderForResult调用
在beginSignIn的OnSuccessListener中,用oneTapLauncher.launch()替代原来的startIntentSenderForResult:
oneTapClient.beginSignIn(signUpRequest) .addOnSuccessListener(this, result -> { try { IntentSenderRequest intentSenderRequest = new IntentSenderRequest.Builder(result.getPendingIntent()) .build(); oneTapLauncher.launch(intentSenderRequest); } catch (Exception e) { Log.e(TAG, "Couldn't start One Tap UI: " + e.getLocalizedMessage()); } }) .addOnFailureListener(this, e -> { Log.d(TAG, e.getLocalizedMessage()); });
关键说明
StartIntentSenderForResult是专门用于处理IntentSender的Activity Result契约,完全替代旧的startIntentSenderForResult方法。- 通过
IntentSenderRequest.Builder将PendingIntent包装成请求对象,传递给Launcher的launch方法。 - 在回调中可以通过
oneTapClient.getSignInCredentialFromIntent()解析返回的登录凭证,完成后续登录逻辑。
内容的提问来源于stack exchange,提问作者Hong
相关产品推荐
相关产品推荐

