startActivityForResult已废弃,Google登录功能该如何适配新实现?
startActivityForResult废弃后的谷歌登录适配方案
你遇到的闪退确实可能和高版本依赖/系统中startActivityForResult接口废弃有关,官方替换实现为Activity Result API,适配方式如下:
1. 核心逻辑变动
- 无需再声明请求码常量,提前在Activity中注册结果回调启动器
- 触发跳转时直接调用启动器的
launch方法传入意图即可,所有返回结果统一在注册的回调中处理
2. 完整修改后的代码
public class MainActivity extends AppCompatActivity { SignInButton signin; private GoogleSignInClient mGoogleSignInClient; // 注册谷歌登录结果回调启动器,替代原有startActivityForResult+onActivityResult逻辑 private ActivityResultLauncher<Intent> signInLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK) { Intent data = result.getData(); Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); handleSignInResult(task); } } ); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 必须绑定按钮实例,原有代码漏了这步也是闪退的常见原因 signin = findViewById(R.id.你布局中谷歌登录按钮的ID); requestGoogleSignIn(); signin.setOnClickListener(view -> signIn()); } private void requestGoogleSignIn() { GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestEmail() .build(); mGoogleSignInClient = GoogleSignIn.getClient(this, gso); } private void signIn() { Intent signInIntent = mGoogleSignInClient.getSignInIntent(); // 用启动器触发登录跳转,替换原有startActivityForResult signInLauncher.launch(signInIntent); } // 登录结果处理方法,可根据自身业务修改 private void handleSignInResult(Task<GoogleSignInAccount> completedTask) { try { GoogleSignInAccount account = completedTask.getResult(ApiException.class); // 登录成功后逻辑,比如跳转主页、保存账号凭证等 String idToken = account.getIdToken(); } catch (ApiException e) { // 登录失败错误处理 e.printStackTrace(); } } }
3. 依赖要求
- 确保项目
build.gradle中androidx.activity:activity版本不低于1.2.0,androidx.fragment:fragment版本不低于1.3.0,否则无法调用Activity Result API
内容的提问来源于stack exchange,提问作者Rafael Campos
相关产品推荐
相关产品推荐

