2017-10-04 48 views
0

我有這個錯誤,我真的不知道它是什麼。我認爲這是一個循環,但我找不到它。你能幫我找到並安排它嗎?儘管我不完全確定,但我認爲它在這個屏幕中。 prolema匹配的頁面在Firebase身份驗證中訪問谷歌。 謝謝大家異常java.lang.StackOverflowError:堆棧大小8MB

我知道有類似這樣的其他問題,但我沒有找到我的答案

Exception java.lang.StackOverflowError: stack size 8MB com.google.android.gms.internal.zzbtg.zzaz (zzbtg.java) 

這是我發現的問題

public class GoogleSignIn extends BaseActivity implements 
    GoogleApiClient.OnConnectionFailedListener, 
    View.OnClickListener { 

private static final String TAG = "GoogleActivity"; 
private static final int RC_SIGN_IN = 9001; 

// [START declare_auth] 
private FirebaseAuth mAuth; 
// [END declare_auth] 

// [START declare_auth_listener] 
private FirebaseAuth.AuthStateListener mAuthListener; 
// [END declare_auth_listener] 

private GoogleApiClient mGoogleApiClient; 
private DatabaseReference mDatabase; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.auth_google_sign_in); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    mDatabase = FirebaseDatabase.getInstance().getReference(); 
    toolbar.setTitleTextColor(Color.WHITE); 
    toolbar.setNavigationIcon(getResources().getDrawable(R.mipmap.ic_arrow_back_white_24dp)); 
    toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //What to do on back clicked 
      onBackPressed(); 
     } 
    }); 

    // Button listeners 
    findViewById(R.id.sign_in_button).setOnClickListener(this); 

    // [START config_signin] 
    // Configure Google Sign In 
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestIdToken(getString(R.string.default_web_client_id)) 
      .requestEmail() 
      .build(); 
    // [END config_signin] 

    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
      .build(); 

    // [START initialize_auth] 
    mAuth = FirebaseAuth.getInstance(); 
    // [END initialize_auth] 

    // [START auth_state_listener] 
    mAuthListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
      FirebaseUser user = firebaseAuth.getCurrentUser(); 
      if (user != null) { 
       // User is signed in 
       Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); 
      } else { 
       // User is signed out 
       Log.d(TAG, "onAuthStateChanged:signed_out"); 
      } 
      // [START_EXCLUDE] 

      // [END_EXCLUDE] 
     } 
    }; 
    // [END auth_state_listener] 
} 

// [START on_start_add_listener] 
@Override 
public void onStart() { 
    super.onStart(); 
    mAuth.addAuthStateListener(mAuthListener); 
} 
// [END on_start_add_listener] 

// [START on_stop_remove_listener] 
@Override 
public void onStop() { 
    super.onStop(); 
    if (mAuthListener != null) { 
     mAuth.removeAuthStateListener(mAuthListener); 
    } 
} 
// [END on_stop_remove_listener] 

// [START onactivityresult] 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); 
    if (requestCode == RC_SIGN_IN) { 
     GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
     if (result.isSuccess()) { 
      // Google Sign In was successful, authenticate with Firebase 
      GoogleSignInAccount account = result.getSignInAccount(); 
      firebaseAuthWithGoogle(account); 
     } else { 
      Toast.makeText(GoogleSignIn.this, getString(R.string.auth_failed), Toast.LENGTH_LONG).show(); 

     } 
    } 
} 
// [END onactivityresult] 

// [START auth_with_google] 
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { 
    Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId()); 
    // [START_EXCLUDE silent] 
    showProgressDialog(); 
    // [END_EXCLUDE] 

    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
    mAuth.signInWithCredential(credential) 
      .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 




        // If sign in fails, display a message to the user. If sign in succeeds 
        // the auth state listener will be notified and logic to handle the 
        // signed in user can be handled in the listener. 
        if (!task.isSuccessful()) { 
         Toast.makeText(GoogleSignIn.this, "Authentication failed", Toast.LENGTH_SHORT).show(); 
        } 
        // [START_EXCLUDE] 
        hideProgressDialog(); 
        onAuthSuccess(task.getResult().getUser()); 
        // [END_EXCLUDE] 

        Intent intent = new Intent(GoogleSignIn.this, HomeActivity.class); 
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
        startActivity(intent); 
       } 
      }); 
} 
// [END auth_with_google] 

// [START signin] 
public void signIn() { 
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
    startActivityForResult(signInIntent, RC_SIGN_IN); 
} 
// [END signin] 

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    Toast.makeText(this, "Google Play Services error.", Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onClick(View v) { 
    int i = v.getId(); 
    if (i == R.id.sign_in_button) { 
     signIn(); 
    } 
} 
private void onAuthSuccess(FirebaseUser user) { 

    SharedPreferences.Editor sharedPreferences = getSharedPreferences("GOOGLE_LOGIN", MODE_PRIVATE).edit(); 
    sharedPreferences.putString("google", "true").apply(); 

    mDatabase.child("user-profile").child(user.getUid()).child("username").setValue(user.getDisplayName()); 
    mDatabase.child("user-profile").child(user.getUid()).child("photoUrl").setValue(user.getPhotoUrl()); 
    mDatabase.child("user-profile").child(user.getUid()).child("uid").setValue(user.getUid()); 
    mDatabase.child("user-profile").child(user.getUid()).child("email").setValue(user.getEmail()); 

} 

活動}

+0

發佈整個堆棧跟蹤。堆棧溢出錯誤幾乎總是無限遞歸的結果。 –

+0

這個問題我沒有一個完整的堆棧。我用我得到的小小更新了這個問題。我找不到導致它的那個 – hulon

+0

[嘗試在Firebase數據庫中保存對象時發生錯誤「java.lang.StackOverflowError:」)的重複(https://stackoverflow.com/questions/41567576/error-java-lang -stackoverflowerror,當試到保存對象功能於火力,databa) –

回答

3

問題是這種說法:

mDatabase.child("user-profile").child(user.getUid()).child("photoUrl") 
    .setValue(user.getPhotoUrl()); 

getPhotoUrl()返回一個Uri。這不是setValue()支持的對象類型之一。您應該存儲getPhotoUrl().toString()