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
相关产品推荐
相关产品推荐

