2016-04-16 15 views
2

OAuthを使用して、ユーザーがGoogleアカウントを介してアンドロイドアプリにログインできるようにします。ユーザーが初めてGoogleログインボタンをタップすると、アカウントを選択するダイアログが表示されます。ユーザがログアウトして別のGoogleアカウントでログインすることを決定したときに、再び、それはアカウントを選択するように要求しない、それがアカウントにログインするユーザは、前回Googleログインは、ユーザーがログインするたびに同じアカウントを使用します。

@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

貼り付けを取得した後、この

mGoogleApiClient.clearDefaultAccountAndReconnect(); 

を追加! – Matthew

+0

Fine!ちょっと待って ! –

+3

ログインの詳細を取得したら、 'mGoogleApiClient'を切断してください。あなたがそれをさらに必要としないので。 –

答えて

-1

使用:

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

をあなたは、AR場合eにログアウト機能があります。ログアウトコードの直前に次のコードを入力してください。

希望します。

EDITは:

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(); 
}} 

説明:あなたは、以下のコードで、あなたにstoreDatainSharedPreferences方法を交換してくださいすることができ、第一の溶液の場合:あなたのアプリケーションに関連するすべてのクッキー をクリアするためのコードです。 クッキーに保存されている可能性のある以前のデータを消去したいので、これはあなたの状況に完全に役立ちます。

説明:第2の解決策:これは、mGoogleApiClientを切断するコードです。これはあなたがmGoogleApiClientを必要としないようにsharedPrefにデータを保存しているので便利です。

+0

コメントダウン投票の理由@downvoter –

+0

バディはうまくいきません! –

5

最も簡単な方法は、結果(onActivityResult)を処理した後にクライアントをログアウトすることです。ログアウトを開始する前に、クライアントが接続されていることを確認してください。ここに私のコードの抜粋です:

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

JavaScriptクライアントを使用して解決策を探している間、私はこの質問を見つけたが、それは、Androidと似ているかもしれません。

signIn({ prompt: 'select_account' })

select_account

は、認証サーバには、Googleアカウントを選択するようにユーザに要求します。これにより、複数のアカウントを持つユーザーが、現在のセッションを持つ可能性のある複数のアカウントの中から選択することができます。

https://developers.google.com/identity/sign-in/web/reference#googleauthsigninoptionsを参照してください。あなたは、彼らはあなたが必要なものを達成するために、次を使用し記号でユーザーを取り消していない

0

あらゆる活動にこのコードを入れて、記号のボタンをクリックし、それを呼び出す:

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

}

このonCreate()での書き込み:

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

オーバーライドこのonStart()で:

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

参考リンク:Google Developer Page

1

Simplelyワークアウト私

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> OnButtonClickedで

について
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
       startActivityForResult(signInIntent, 2); 

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

チャームのように働いた。 「mGoogleApiClient.clearDefaultAccountAndReconnect();」を追加しました。 Firebaseユーザーを取得した後に動作しています。 – Shaheera

4

だけので、我々は、助けてくださいすることができ、関連するコードでfirebaseユーザー

+2

説明のためのビットは素晴らしかったでしょう。 –

+1

@ J..S - 私はなぜかどちらかについてはっきりしていませんでしたが、それを見てから、私が理解しているように説明があります:Firebaseユーザーをいれば、GoogleApiClientにはデフォルトそれは再び認証を行うために戻ります。私はJavadocを超えてGoogleApiClientでたくさんのチュートリアルやサンプルを見つけることができませんでした:(これはこの日を保存しました、ありがとう! – gnB

関連する問題