Android Google登录开发报错:Wrong 1st Argument Type问题求助
解决Google登录中
enableAutoManage参数类型不匹配的错误 问题根源
你遇到的错误核心很明确:GoogleApiClient.Builder的enableAutoManage()方法要求第一个参数必须是android.support.v4.app.FragmentActivity(或它的子类,比如AppCompatActivity),但你的WelcomeActivity目前继承的是普通的android.app.Activity,类型不匹配直接触发了这个报错。
具体修复步骤
修改Activity的继承关系
把WelcomeActivity的父类从Activity改成AppCompatActivity(它是FragmentActivity的子类,完全满足enableAutoManage的参数要求):public class WelcomeActivity extends AppCompatActivity {你代码里已经导入了
android.support.v7.app.AppCompatActivity,所以只需要修改这一行继承代码就行。修复
gso的变量作用域问题
你代码里的GoogleSignInOptions gso是在onCreate方法之后定义的,这会导致onCreate里构建mGoogleApiClient时找不到gso变量。把gso的定义移到onCreate内部、mGoogleApiClient构建之前:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate( savedInstanceState ); requestWindowFeature( Window.FEATURE_NO_TITLE ); setContentView( R.layout.activity_welcome ); // 提前定义gso,确保后续能正常调用 GoogleSignInOptions gso = new GoogleSignInOptions.Builder( GoogleSignInOptions.DEFAULT_SIGN_IN ) .requestIdToken( getString( R.string.default_web_client_id ) ) .requestEmail() .build(); button = (SignInButton) findViewById( R.id.googlebtn ); mAuth = FirebaseAuth.getInstance(); // 后续的AuthStateListener、GoogleApiClient构建代码... }补充登录按钮的点击事件
你的signIn()方法是私有的,但代码里没给Google登录按钮绑定点击逻辑,记得补上:button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { signIn(); } });
修复后的核心代码片段
import android.support.v7.app.AppCompatActivity; // 其他导入保持不变 public class WelcomeActivity extends AppCompatActivity { SignInButton button; FirebaseAuth mAuth; GoogleApiClient mGoogleApiClient; private static int RC_SIGN_IN = 2; FirebaseAuth.AuthStateListener mAuthListener; @Override protected void onStart() { super.onStart(); mAuth.addAuthStateListener(mAuthListener); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_welcome); // 提前定义gso GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestEmail() .build(); button = (SignInButton) findViewById(R.id.googlebtn); mAuth = FirebaseAuth.getInstance(); mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { if (firebaseAuth.getCurrentUser() != null) { startActivity(new Intent(WelcomeActivity.this, MainActivity.class)); } } }; // 现在构建GoogleApiClient不会有类型错误 mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this, new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { Toast.makeText(WelcomeActivity.this, "Not correct", Toast.LENGTH_SHORT).show(); } }) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); // 给登录按钮绑定点击事件 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { signIn(); } }); } // 其他方法(signIn、onActivityResult、firebaseAuthWithGoogle)保持不变 }
做完这些修改后,参数类型不匹配的错误就会消失,同时也解决了代码里的变量作用域和按钮无响应的问题。
内容的提问来源于stack exchange,提问作者Sudhakar Vijayasarathy
相关产品推荐
相关产品推荐

