2016-04-16 6 views
2

Ich benutze OAuth, damit sich Nutzer über ein Google-Konto bei der Android-App anmelden können. Wenn der Nutzer zum ersten Mal auf die Google-Anmeldeschaltfläche klickt, wird ein Dialogfeld zur Auswahl des Kontos erstellt. Auch wenn sich der Benutzer abmeldet und entscheidet mit anderen Google-Konto anmelden, es ist nicht das Konto zu wählen, nicht auffordern, es auf dem Konto anmeldet hatte wählte der Benutzer die vorherige ZeitGoogle Login verwendet jedes Mal dasselbe Konto, wenn sich der Benutzer anmeldet

'

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.login); 
    initialize(); 
    Firebase.setAndroidContext(this); 
    ref=new Firebase("https://texter10c.firebaseio.com"); 

    loginButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      progressDialog.setMessage("Logging in !"); 
      progressDialog.setTitle("Hang on!"); 
      progressDialog.show(); 

      ref.authWithPassword(emailField.getText().toString(), passwordField.getText().toString(), new Firebase.AuthResultHandler() { 
       @Override 
       public void onAuthenticated(AuthData authData) { 
        Log.e("Authenticated","Authenticated"); 
        getUserIdandLogin(); 
       } 

       @Override 
       public void onAuthenticationError(FirebaseError firebaseError) { 
        progressDialog.dismiss(); 
        Toast.makeText(LoginActivity.this, firebaseError.getMessage(), Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 
    }); 

    signupButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(LoginActivity.this, SignupActivity.class); 
      startActivity(intent); 
     } 
    }); 

    googleSignInButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      progressDialog.setTitle("Contacting Google"); 
      progressDialog.setMessage("Logging you in"); 
      progressDialog.show(); 
      if(!mGoogleApiClient.isConnected()) 
      mGoogleApiClient.connect(); 
     } 
    }); 

} 

private void getGoogleToken(){ 

    AsyncTask<Void,Void,String> task=new AsyncTask<Void, Void, String>() { 
     @Override 
     protected String doInBackground(Void... params) { 
      final String scopes="oauth2:"+"https://www.googleapis.com/auth/plus.login"+" "+"https://www.googleapis.com/auth/plus.me"; 
      try { 
       if(!mGoogleApiClient.isConnected()) 
       { 
        mGoogleApiClient.connect(); 
       } 
       googleAccessToken= GoogleAuthUtil.getToken(LoginActivity.this,Plus.AccountApi.getAccountName(mGoogleApiClient),scopes); 
       Log.e("AccessToken",googleAccessToken+""); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
      catch (GoogleAuthException e) 
      { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
      try { 
       ref.authWithOAuthToken("google", googleAccessToken, new Firebase.AuthResultHandler() { 
        @Override 
        public void onAuthenticated(final AuthData authData) { 
         try { 
          Log.e("Firebase", "Google Authentication Success"); 
          Log.e("Username", authData.getProviderData().get("displayName").toString()); 
          Log.e("Id", authData.getProviderData().get("id").toString()); 


          Firebase googleUserRef = ref.child("UserDetails/names/" + authData.getProviderData().get("id").toString()); 
          Map<String, String> googleUserMap = new HashMap<String, String>(); 
          googleUserMap.put("Username", authData.getProviderData().get("displayName").toString()); 
          final String UserID = "GoogleUser" + authData.getProviderData().get("displayName") + authData.getProviderData().get("id"); 
          googleUserMap.put("UserId", UserID); 

          googleUserRef.setValue(googleUserMap, new Firebase.CompletionListener() { 
           @Override 
           public void onComplete(FirebaseError firebaseError, Firebase firebase) { 
            progressDialog.dismiss(); 
            dataStore.setCurrentUserName(authData.getProviderData().get("displayName").toString()); 
            dataStore.setCurrentUserID(UserID); 
            storeDatainSharedPreferences(); 
            Intent intent = new Intent(LoginActivity.this, DialogActivity.class); 
            startActivity(intent); 
           } 
          }); 
         } 
         catch (NullPointerException e) 
         { 
          e.printStackTrace(); 
         } 
        } 

        @Override 
        public void onAuthenticationError(FirebaseError firebaseError) { 
         Log.e("GogoleAuthFailed", firebaseError.getMessage()); 

        } 
       }); 
      } 
      catch (NullPointerException e) 
      { 
       Log.e("Accesstoken problem",e.getMessage()); 
      } 
     } 
    }; 
    task.execute(); 
} 

public void getUserIdandLogin() 
{ 
    dataStore.userDialogMap=new ArrayList<Map<String,String>>(); 
    dataStore.generatedChatIds=new ArrayList<>(); 
    Firebase refUser=ref.child("UserDetails/names"); 
    refUser.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      Map<String, String> map = new HashMap<String, String>(); 
      map = dataSnapshot.getValue(Map.class); 
      try{ 
       if (map.get("Email").equals(emailField.getText().toString())) 
       { 
        Toast.makeText(LoginActivity.this, "Successfilly Logged in", Toast.LENGTH_SHORT).show(); 
        dataStore.setCurrentUserName(map.get("Username")); 
        dataStore.setCurrentUserID(map.get("UserId")); 
        intent=new Intent(LoginActivity.this,DialogActivity.class); 
        startActivity(intent); 
        storeDatainSharedPreferences(); 
        progressDialog.dismiss(); 
       } 

      } 
      catch (NullPointerException e) 
      { 
       Log.e("NullPointerGUser",e.getMessage()); 
      } 
     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 
    }); 
} 

private void storeDatainSharedPreferences() { 
    try { 
     SharedPreferences.Editor editor = getSharedPreferences(NEW_PREFS, MODE_PRIVATE).edit(); 
     editor.putString("CurrentUsername", dataStore.getCurrentUserName()); 
     editor.putString("CurrentUserId", dataStore.getCurrentUserID()); 
     editor.commit(); 
    } 
    catch (NoSuchElementException e) 
    { 
     new AlertDialog.Builder(LoginActivity.this).setMessage("There was an error whil logging in") 
       .setTitle("Little Problem here!").setPositiveButton("Retry", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       Intent intent=new Intent(LoginActivity.this,LoginActivity.class); 
       removeDatainSharedPreferences(); 
       mGoogleApiClient.disconnect(); 
       startActivity(intent); 
      } 
     }).show(); 
    } 
} 

private void removeDatainSharedPreferences() { 
    SharedPreferences.Editor editor = getSharedPreferences(NEW_PREFS, MODE_PRIVATE).edit(); 
    editor.remove("CurrentUsername"); 
    editor.remove("CurrentUserId"); 
    editor.commit(); 
} 


private void initialize() { 
    emailInputLayout=(TextInputLayout)findViewById(R.id.emailInputLayout); 
    emailField=(EditText)findViewById(R.id.emailField); 
    passwordField=(EditText)findViewById(R.id.passwordField); 
    passwordInputLayout=(TextInputLayout)findViewById(R.id.passwordInputLayout); 
    loginButton=(Button)findViewById(R.id.loginButton); 
    emailInputLayout.setHint("Email"); 
    passwordInputLayout.setHint("Password"); 
    progressDialog=new ProgressDialog(LoginActivity.this); 
    signupButton=(TextView)findViewById(R.id.signupButton); 
    forgotPasswordButton=(TextView)findViewById(R.id.forgotPasswordField); 
    googleSignInButton=(SignInButton)findViewById(R.id.googleSignInButton); 
    googleSignInButton.setColorScheme(SignInButton.COLOR_AUTO); 
    forgotPasswordButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent=new Intent(LoginActivity.this,ForgotPasswordActivity.class); 
      startActivity(intent); 
     } 
    }); 

    SharedPreferences sharePreferences=getSharedPreferences(NEW_PREFS,MODE_PRIVATE); 
    if(!sharePreferences.getString("CurrentUsername","null").equals("null")) { 
     Log.e("SharedPreferences", sharePreferences.getString("CurrentUsername", "null")); 
     Log.e("SharedPreferences",sharePreferences.getString("CurrentUserId",null)); 
     Intent intent=new Intent(LoginActivity.this,DialogActivity.class); 
     startActivity(intent); 
    } 

    mGoogleApiClient=new GoogleApiClient.Builder(this) 
      .addApi(Plus.API) 
      .addScope(Plus.SCOPE_PLUS_LOGIN) 
      .addScope(Plus.SCOPE_PLUS_PROFILE) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this).build(); 


    if(!isNetworkAvailable()) 
    { 
     snackbar=Snackbar.make(findViewById(android.R.id.content),"You are offline",Snackbar.LENGTH_INDEFINITE) 
       .setAction("Retry", new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         if(!isNetworkAvailable()) 
          dismissSnackBar(); 
         else 
          snackbar.show(); 
        } 

       }); 
     snackbar.show(); 
    } 

} 

private void dismissSnackBar() { 
    snackbar.dismiss(); 
} 


private boolean isNetworkAvailable() 
{ 
    ConnectivityManager manager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkIngo=manager.getActiveNetworkInfo(); 
    return networkIngo!=null&& networkIngo.isConnected(); 
} 

@Override 
public void onConnected(@Nullable Bundle bundle) { 
     Log.e("GoogleApi","Connected"); 
     getGoogleToken(); 
} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
    Log.e("GoogleApi",connectionResult.toString()); 
    if(!connectionResult.hasResolution()) 
    { 
     GooglePlayServicesUtil.getErrorDialog(connectionResult.getErrorCode(),LoginActivity.this,0).show(); 
    } 
    if(connectionResult.isSuccess()) 
    { 
     getGoogleToken(); 
    } 
    try 
    { 
     connectionResult.startResolutionForResult(this,100); 
    } 
    catch (IntentSender.SendIntentException e) 
    { 
     e.printStackTrace(); 
    } 
} 

}

`

+0

Paste in einen entsprechenden Code bekommen, damit wir helfen, bitte! – Matthew

+0

Gut! Gib mir eine Minute ! –

+3

Trennen Sie den 'mGoogleApiClient' direkt nachdem Sie die Anmeldedaten erhalten haben. Da brauchst du es nicht weiter. –

Antwort

-1

signOut Ihre Benutzer verwenden:

Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
      new ResultCallback<Status>() { 
       @Override 
       public void onResult(Status status) { 
        // ... 
       } 
      }); 
-1

Wenn Sie ar e mit Logout-Funktionalität. Setzen Sie den folgenden Code direkt vor dem Abmeldecode:

Ich hoffe, dies wird Ihnen helfen.

EDIT: Sie können auch versuchen Sie storeDatainSharedPreferences Methode mit folgenden Code ersetzen:

private void storeDatainSharedPreferences() { 
try { 

    SharedPreferences.Editor editor = getSharedPreferences(NEW_PREFS, MODE_PRIVATE).edit(); 
    editor.putString("CurrentUsername", dataStore.getCurrentUserName()); 
    editor.putString("CurrentUserId", dataStore.getCurrentUserID()); 
    editor.commit(); 
    if(mGoogleApiClient!=null) 
      mGoogleApiClient.disconnect(); 
} 
catch (NoSuchElementException e) 
{ 
    new AlertDialog.Builder(LoginActivity.this).setMessage("There was an error whil logging in") 
      .setTitle("Little Problem here!").setPositiveButton("Retry", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      Intent intent=new Intent(LoginActivity.this,LoginActivity.class); 
      removeDatainSharedPreferences(); 
      mGoogleApiClient.disconnect(); 
      startActivity(intent); 
     } 
    }).show(); 
}} 

Erläuterung: Für Erste Lösung: Es ist der Code, alle Cookies löschen auf Ihre Anwendung im Zusammenhang . Dies kann Hilfe in Ihrer Situation sein , weil Sie die vorherigen Daten löschen möchten, die in Cookies gespeichert werden können.

Erläuterung: Für die zweite Lösung: Es ist der Code, der den mGoogleApiClient trennt. was hilfreich sein wird, weil Sie die Daten in sharedPref jetzt gespeichert haben, brauchen Sie mGoogleApiClient nicht.

+0

kommentieren Sie den Grund für down voting @ downvoter –

+0

Scheint nicht, Kumpel zu arbeiten! –

5

Der einfachste Weg ist, den Client abzumelden, nachdem Sie Ihr Ergebnis behandelt haben (onActivityResult). Stellen Sie nur sicher, dass der Client verbunden ist, bevor Sie die Abmeldung auslösen. Hier ist ein Ausschnitt aus meinem Code:

private void handleGoogleLoginResult(Intent data) { 
    if (data != null) { 
     // get result from data received 
     GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
     int statusCode = result.getStatus().getStatusCode(); 
     if (result.isSuccess() && result.getSignInAccount() != null) { 
      // Signed in successfully 

     } 
     // logout 
     if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) { 
      Auth.GoogleSignInApi.signOut(mGoogleApiClient); 
     } 
    } 
} 
0

ich diese Frage gefunden, während Suche nach einer Lösung, den Javascript-Client verwenden, aber es könnte mit Android ähnlich sein.

signIn({ prompt: 'select_account' })

select_account

Der Autorisierungs-Server fordert den Benutzer auf ein Google-Konto auszuwählen. Dadurch kann ein Benutzer mit mehreren Konten zwischen mehreren Konten auswählen, für die er möglicherweise aktuelle Sitzungen hat.

Siehe https://developers.google.com/identity/sign-in/web/reference#googleauthsigninoptions.

0

Sie den Widerruf nicht vom Benutzer durch Zeichen aus ihnen die folgenden verwenden, um zu erreichen, was Sie brauchen:

Setzen Sie diesen Code in jede Aktivität und nennen es in Zeichen aus Schaltfläche klicken:

private void signOut() { 
Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
     new ResultCallback<Status>() { 
      @Override 
      public void onResult(Status status) { 
       // ... 
      } 
     }); 

}

schreiben diese in onCreate():

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

Überschreibung dies in onStart():

@Override 
protected void onStart() { 
    super.onStart(); 
    mGoogleApiClient.connect(); 
} 

Referenz-Link: Google Developer Page

1

simplely Training für mich

1>Activity implements GoogleApiClient.OnConnectionFailedListener {

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

3> In OnButtonClicked

4>

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == 2) { 
      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
      if (result.isSuccess()) { 
       GoogleSignInAccount acct = result.getSignInAccount(); 
       if(acct!=null) {    
        //Take all data You Want 
        String identifier = acct.getId()+"";     
        String displayName = acct.getDisplayName()+""; 
        //After You got your data add this to clear the priviously selected mail 
        mGoogleApiClient.clearDefaultAccountAndReconnect(); 
       } 
      }else Log.e("handleSignInResult","Failed ; "+result.getStatus()); 
     } 
    } 
+2

Arbeitete wie ein Charme. Ich habe gerade "mGoogleApiClient.clearDefaultAccountAndReconnect();" hinzugefügt. nachdem Firebase-Benutzer und es funktioniert. – Shaheera

4

Fügen Sie einfach diese

mGoogleApiClient.clearDefaultAccountAndReconnect(); 

nach dem Feuerbasis Benutzer

+2

Ein bisschen Erklärung wäre schön gewesen. –

+1

@ J..S - Ich wusste nicht genau, warum, aber nachdem ich gesehen habe, dass es funktioniert, ist die Erklärung so, wie ich es verstehe: Sobald Sie den Firebase-Benutzer haben, sagen Sie dem GoogleApiClient, dass er keine Standardeinstellungen verwenden sollte es geht zurück, um seine Authentifizierung erneut zu tun. Ich konnte nicht viele Tutorials/Beispiele auf GoogleApiClient finden, die über den Javadoc hinausgehen :(- Das hat den Tag gerettet, danke! – gnB