You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android旧项目CredentialsOptions$Builder解析失败及替代方案咨询

问题分析与解决方案

1. NoClassDefFoundError的原因及修复

这个崩溃和startActivityForResult废弃无关,根源是Google Play Services相关依赖缺失或版本不兼容:

  • 错误提示找不到CredentialsOptions$Builder类,该类属于Google Play Services Auth库,而Firebase UI Auth依赖这个类运行。
  • 实体手机正常是因为设备上的Google Play Services版本满足依赖要求,但AVD要么是系统镜像不带Google Play,要么是内置的Google Play Services版本过低。

修复步骤:

  • 检查Module级build.gradle,确保添加了Google Play Services Auth依赖,且版本和Firebase UI Auth版本匹配:
    // 示例版本,需和你的Firebase UI Auth版本对应
    implementation 'com.google.android.gms:play-services-auth:20.7.0'
    implementation 'com.firebaseui:firebase-ui-auth:8.0.2'
    
  • 重新创建AVD时选择带Google Play标记的系统镜像,或者打开现有模拟器后,进入Google Play应用将服务更新到最新版本。

2. 替换废弃的startActivityForResult为registerForActivityResult

虽然废弃不是当前崩溃的原因,但建议替换以适配新API,具体操作如下:

步骤1:定义结果处理器

在Activity的成员变量中声明ActivityResultLauncher:

private ActivityResultLauncher<Intent> signInLauncher;

步骤2:初始化处理器并重构登录逻辑

在onCreate方法中初始化处理器,同时替换原有的startActivityForResult调用:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // 初始化登录结果回调
    signInLauncher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        result -> {
            if (result.getResultCode() == RESULT_OK) {
                FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                if (user != null) {
                    Log.d("AUTH", user.getEmail());
                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                    intent.putExtra("firebaseuser", user.getDisplayName());
                    intent.putExtra("firebaseuid", user.getUid());
                    startActivity(intent);
                }
            } else {
                Log.d("AUTH", "NOT AUTHENTİCATED");
            }
        }
    );

    // 原有登录状态检查逻辑
    FirebaseAuth auth = FirebaseAuth.getInstance();
    if (auth.getCurrentUser() != null) {
        FirebaseUser user = auth.getCurrentUser();
        Log.d("AUTH", user.getEmail());
        String firebaseuser = user.getDisplayName();
        String uid = user.getUid();
        Log.i("myuserid: ", uid);
        Intent intent = new Intent(getApplicationContext(), MainActivity.class);
        intent.putExtra("firebaseuser", firebaseuser);
        intent.putExtra("firebaseuid", uid);
        startActivity(intent);
    } else {
        Log.d("AUTH222", "burada");
        // 用launcher启动登录界面,替代startActivityForResult
        Intent signInIntent = AuthUI.getInstance()
                .createSignInIntentBuilder()
                .setAvailableProviders(Arrays.asList(
                        new AuthUI.IdpConfig.FacebookBuilder().build(),
                        new AuthUI.IdpConfig.EmailBuilder().build(),
                        new AuthUI.IdpConfig.GoogleBuilder().build()
                ))
                .build();
        signInLauncher.launch(signInIntent);
    }
}

步骤3:移除旧方法

直接删除原有的onActivityResult重写方法,逻辑已整合到新的回调中。


内容的提问来源于stack exchange,提问作者Faruk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 03:42:42