2017-07-02 541 views
0

我想整合谷歌登錄我的應用程序,但它沒有追求我到另一個活動,它顯示唯一的身份驗證在模擬器中失敗,但是當我在真實設備上測試它時,應用程序停止點擊谷歌標誌按鈕。這是我下面谷歌登錄身份驗證失敗

import android.content.Intent; 
import android.support.annotation.NonNull; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Toast; 

import com.google.android.gms.auth.api.Auth; 
import com.google.android.gms.auth.api.signin.GoogleSignInAccount; 
import com.google.android.gms.auth.api.signin.GoogleSignInOptions; 
import com.google.android.gms.auth.api.signin.GoogleSignInResult; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.SignInButton; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.tasks.OnCompleteListener; 
import com.google.android.gms.tasks.Task; 
import com.google.firebase.auth.AuthCredential; 
import com.google.firebase.auth.AuthResult; 
import com.google.firebase.auth.FirebaseAuth; 
import com.google.firebase.auth.FirebaseUser; 
import com.google.firebase.auth.GoogleAuthProvider; 

public class googleact extends AppCompatActivity { 

SignInButton button; 
FirebaseAuth firebaseauth; 
private final static int RC_SIGN_IN=2; 
GoogleApiClient mGoogleApiClient; 
FirebaseAuth.AuthStateListener mAuthListener; 


@Override 
protected void onStart() { 
    super.onStart(); 
    firebaseauth.addAuthStateListener(mAuthListener); 
} 

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


    button =(SignInButton) findViewById(R.id.googlebtn); 
    firebaseauth = FirebaseAuth.getInstance(); 

    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      signIn(); 
     } 
    }); 

    mAuthListener=new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
      if (firebaseAuth.getCurrentUser() !=null){ 

       startActivity(new Intent(googleact.this, gprofile.class)); 
      } 
     } 
    }; 

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


     // Build a GoogleApiClient with access to the Google Sign-In API and 
the 
// options specified by gso. 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .enableAutoManage(this /* FragmentActivity */, new 
    GoogleApiClient.OnConnectionFailedListener() { 
       @Override 
       public void onConnectionFailed(@NonNull ConnectionResult 
    connectionResult) { 
        Toast.makeText(googleact.this,"something went wrong", 
    Toast.LENGTH_SHORT).show(); 
       } 
      }) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
      .build(); 

} 


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


private void signIn() { 
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
    startActivityForResult(signInIntent, RC_SIGN_IN); 
} 

@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(googleact.this,"AUTH WENT WRONG", 
Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

    private void firebaseAuthWithGoogle(GoogleSignInAccount account) { 
    AuthCredential credential = 
GoogleAuthProvider.getCredential(account.getIdToken(), null); 
    firebaseauth.signInWithCredential(credential) 
      .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        if (task.isSuccessful()) { 
         // Sign in success, update UI with the signed-in 
user's information 
         Log.d("TAG", "signInWithCredential:success"); 
         FirebaseUser user = firebaseauth.getCurrentUser(); 
         // updateUI(user); 
        } else { 
         // If sign in fails, display a message to the user. 
         Log.w("TAG", "signInWithCredential:failure", 
task.getException()); 
         Toast.makeText(googleact.this, "Authentication 
failed.", 
           Toast.LENGTH_SHORT).show(); 
         // updateUI(null); 
        } 

        // ... 
       } 
      }); 

    } 
} 
這裏下面

代碼在logcat的 07-02 13:55:11.367 24547-24547 /? I/art:不是延遲啓用-Xcheck:jni (已啓用) 07-02 13:55:11.367 24547-24547 /? W /藝術:意外CPU變體用於使用X86 的默認值:86 07-02 13:55:11.793 24547-24547/com.example.roomsarehere.foodishere W /系統: 類加載器引用未知路徑: /數據/應用/com.example.roomsarehere.foodishere-1/lib/x86 07-02 13:55:12.086 24547-24571/com.example.roomsarehere.foodishere I/DynamiteModule:考慮本地模塊com.google.android.gms。標誌:2 和 遠程模塊com.google.android.gms.flags:0 07-02 13:55:12.086 24547-24571/com.example.roomsarehere.foodishere I/DynamiteModule:選定本地版本com。 google.android.gms.flags 07-02 13:55:12.131 24547-24571/com.example.roo msarehere.foodishere W/System: 類加載器引用未知路徑: 07-02 13:55:12.136 24547-24571/com.example.roomsarehere.foodishere W/System: ClassLoader引用未知路徑:/ system/priv- app/PrebuiltGmsCore/lib/x86 012/07-02 13:55:12.148 24547-24571/com.example.roomsarehere.foodishere D/ApplicationLoaders:忽略Vulkan圖層搜索路徑/ system/priv- app/PrebuiltGmsCore/lib/x86:/system/priv- 命名空間0xa787a090 07-02 13:55:12.194 24547-p/app/PrebuiltGmsCore/24547/com.example.roomsarehere.foodishere I/FA:App 測量正在啓動,版本:11020 07-02 13:55:12.195 24547-24547/com.example.roomsarehere.foodishere I/FA:至 啓用調試日誌記錄運行:adb shell setprop log.tag.FA VERBOSE 07-02 13:55:12.222 24547 -24571/com.example.roomsarehere.foodishere W/DynamiteModule:找不到本地模塊描述符類 com.google.android.gms.crash 未找到。 07-02 13:55:12.265 24547-24547/com.example.roomsarehere.foodishere V/FA: 集啓用

+0

crash log,please? – jagapathi

+0

先生應用程序在真實設備上崩潰,但內部模擬器顯示吐司「身份驗證失敗」意味着任務未完成。 –

回答

0
GoogleSignInOptions gso = new 
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
     .requestIdToken(getString(R.string.default_web_client_id)) 
     .requestEmail() 
     .build(); 

寫這部分的onCreate(外)並運行代碼,並再次改寫的onCreate相同的代碼()評論前一個並運行它可能會做的工作,我面臨着同樣的問題。

0
  1. 在你的Android工作室火力地堡控制檯
  2. LoginActivity.java啓用googleSignIn -

    public class LoginActivity extends AppCompatActivity implements 
    GoogleApiClient.OnConnectionFailedListener{ 
    
    @BindView(R.id.sign_in_button) 
    SignInButton signInButton; 
    
    private FirebaseAuth mFirebaseAuth; 
    private GoogleApiClient googleApiClient; 
    private static int RC_SIGN_IN = 1; 
    private DatabaseReference databaseReference; 
    
    private ProgressDialog progressDialog; 
    
    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_login); 
        ButterKnife.bind(this); 
    
        mFirebaseAuth = FirebaseAuth.getInstance(); 
    
        databaseReference = FirebaseDatabase.getInstance().getReference().child("Users"); 
        progressDialog = new ProgressDialog(this); 
    
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken(getString(
          R.string.default_web_client_id)) 
          .requestEmail() 
          .build(); 
        googleApiClient = new GoogleApiClient.Builder(this) 
          .enableAutoManage(this, this) 
          .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
          .build(); 
    
        signInButton.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient); 
          startActivityForResult(signInIntent, RC_SIGN_IN); 
         } 
        }); 
    } 
    
    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
        super.onActivityResult(requestCode, resultCode, data); 
    
        if (requestCode == RC_SIGN_IN) { 
         GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
    
         progressDialog.setMessage("Signing in..."); 
         progressDialog.show(); 
    
         if (result.isSuccess()) { 
          GoogleSignInAccount account = result.getSignInAccount(); 
          firebaseAuthWithGoogle(account); 
         } else { 
          progressDialog.dismiss(); 
          Log.e(LoginActivity.this.getClass().getSimpleName(), "Google Sign-In failed."); 
         } 
        } 
    } 
    
    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { 
        Log.d(LoginActivity.this.getClass().getSimpleName(), "firebaseAuthWithGooogle:" + acct.getId()); 
        AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
        mFirebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
         @Override 
         public void onComplete(@NonNull Task<AuthResult> task) { 
          Log.d(LoginActivity.this.getClass().getSimpleName(), "signInWithCredential:onComplete:" + task.isSuccessful()); 
    
          if (!task.isSuccessful()) { 
           Log.w(LoginActivity.this.getClass().getSimpleName(), "signInWithCredential", task.getException()); 
           Toast.makeText(LoginActivity.this, "Authentication failed.", 
             Toast.LENGTH_SHORT).show(); 
          } else { 
           progressDialog.dismiss(); 
           checkUserExist(); 
          } 
         } 
        }); 
    } 
    private void checkUserExist() { 
    
        if(mFirebaseAuth.getCurrentUser() != null){ 
    
         final String user_id = mFirebaseAuth.getCurrentUser().getUid(); 
    
         databaseReference.addValueEventListener(new ValueEventListener() { 
          @Override 
          public void onDataChange(DataSnapshot dataSnapshot) { 
    
           if(dataSnapshot.hasChild(user_id)){ 
            Intent signinIntent = new Intent(LoginActivity.this,SplashActivity.class); 
            signinIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
            startActivity(signinIntent); 
           } 
           else{ 
            Intent setupAccountIntent = new Intent(LoginActivity.this,SetupAccountActivity.class); 
            setupAccountIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
            startActivity(setupAccountIntent); 
           } 
          } 
    
          @Override 
          public void onCancelled(DatabaseError databaseError) { 
    
          } 
         }); 
        } 
    } 
    
    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
        Toast.makeText(this, "Connection Failed", Toast.LENGTH_LONG).show(); 
    } 
    

    }

所以這裏這個活動,當用戶點擊在Google登錄按鈕上,它會在Firebase控制檯上進行身份驗證,然後轉到用戶可以設置其帳戶的設置帳戶,例如可以獲取用戶示例個人資料照片等的詳細信息。 檢查用戶是否設置了帳戶那麼它會去飛濺活動,這是你的啓動屏幕。 獲取用戶數據並將其保存在「用戶」節點的數據庫中。

  1. SplashActivity。爪哇 - 啓動屏幕

    public class SplashActivity extends AppCompatActivity { 
    
    @BindView(R.id.start) 
    Button start; 
    
    private FirebaseAuth mFirebaseAuth; 
    private FirebaseUser mFirebaseUser; 
    private FirebaseAuth.AuthStateListener mAuthListener; 
    private GoogleApiClient googleApiClient; 
    
    private DatabaseReference userDatabaseReference; 
    
    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_splash); 
        ButterKnife.bind(this); 
    
        mFirebaseAuth = FirebaseAuth.getInstance(); 
        mFirebaseUser = mFirebaseAuth.getCurrentUser(); 
        userDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Users"); 
    
        mAuthListener = new FirebaseAuth.AuthStateListener() { 
         @Override 
         public void onAuthStateChanged(FirebaseAuth firebaseAuth) { 
          if (mFirebaseUser == null) { 
           Intent loginIntent = new Intent(SplashActivity.this,LoginActivity.class); 
           loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
           startActivity(loginIntent); 
          } 
         } 
        }; 
    
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken(getString(R.string.default_web_client_id)) 
          .requestEmail() 
          .build(); 
        googleApiClient = new GoogleApiClient.Builder(this) 
          .addApi(Auth.GOOGLE_SIGN_IN_API , gso) 
          .build(); 
    
        checkUserExist(); 
    } 
    
    private void checkUserExist() { 
    
        if(mFirebaseAuth.getCurrentUser() != null){ 
         final String user_id = mFirebaseAuth.getCurrentUser().getUid(); 
         userDatabaseReference.addValueEventListener(new ValueEventListener() { 
          @Override 
          public void onDataChange(DataSnapshot dataSnapshot) { 
    
           if(!dataSnapshot.hasChild(user_id)){ 
            Intent setupAccountIntent = new Intent(SplashActivity.this,SetupAccountActivity.class); 
            setupAccountIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
            startActivity(setupAccountIntent); 
           } 
          } 
    
          @Override 
          public void onCancelled(DatabaseError databaseError) { 
    
          } 
         }); 
        } 
    } 
    
    @Override 
    public void onStart() { 
        super.onStart(); 
        googleApiClient.connect(); 
        mFirebaseAuth.addAuthStateListener(mAuthListener); 
    } 
    
    @Override 
    public void onStop() { 
        if (mAuthListener != null) { 
         mFirebaseAuth.removeAuthStateListener(mAuthListener); 
        } 
        googleApiClient.disconnect(); 
        super.onStop(); 
    } 
    
    @OnClick(R.id.start) 
    public void onViewClicked() { 
        Intent intent = new Intent(this,MainActivity.class); 
        startActivity(intent); 
        finish(); 
    } 
    

    }

因爲這是我的發射活動,當用戶打開應用程序如果沒有的話證實了它會去登錄,如果沒有設置帳戶,然後去帳戶設置活動。

+0

我的代碼先生呢? –

+0

看起來你正在做同一類2個不同的工作(你可以在我所提供的代碼中看到。1.LoginActivity等是作爲發射活動SplashActivity) 所以LoginActivity手柄按鈕,點擊啓動器中的谷歌標誌活動檢查是否進行身份驗證,然後繼續其他開放LoginActivity – anandwana001

+0

建議在登錄類,並在您的MainActivity,這些用戶會打開應用程序後,看到部分做谷歌的按鍵標誌,檢查是否驗證用戶身份,然後確定其他用戶發送到登錄界面 – anandwana001