2014-02-14 31 views
2

我試圖檢查用戶是否登錄和天氣或不是他們,將他們發送到登錄或保持他們的主要活動。無限循環,當試圖檢查用戶是否登錄。谷歌+

主要活動

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.Menu; 

import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.plus.Plus; 

public class MainActivity extends Activity { 

    private GoogleApiClient mGoogleApiClient; 

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

     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addApi(Plus.API, null).addScope(Plus.SCOPE_PLUS_LOGIN).build(); 

     if (!mGoogleApiClient.isConnected()) { 
      Intent intent = new Intent(MainActivity.this, LoginActivity.class); 
      startActivity(intent); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 
} 

LoginActivity

package com.alfalfa.thisthat; 

import android.app.Activity; 
import android.content.Intent; 
import android.content.IntentSender.SendIntentException; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Toast; 

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.common.api.GoogleApiClient.ConnectionCallbacks; 
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener; 
import com.google.android.gms.plus.Plus; 

public class LoginActivity extends Activity implements ConnectionCallbacks, 
     OnConnectionFailedListener, OnClickListener { 

    private static final int RC_SIGN_IN = 0; 
    private GoogleApiClient mGoogleApiClient; 
    private boolean mIntentInProgress; 
    private boolean mSignInClicked; 
    private static SignInButton mSignInButton; 
    private ConnectionResult mConnectionResult; 

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

     mSignInButton = (SignInButton) findViewById(R.id.sign_in_button); 
     mSignInButton.setOnClickListener(this); 
     mSignInButton.setEnabled(true); 
     mSignInButton.setSize(SignInButton.SIZE_WIDE); 

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

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

    protected void onStop() { 
     super.onStop(); 

     if (mGoogleApiClient.isConnected()) { 
      mGoogleApiClient.disconnect(); 
     } 
    } 

    protected void onActivityResult(int requestCode, int responseCode, 
      Intent intent) { 
     if (requestCode == RC_SIGN_IN) { 
      if (responseCode != RESULT_OK) { 
       mSignInClicked = false; 
      } 

      mIntentInProgress = false; 

      if (!mGoogleApiClient.isConnecting()) { 
       mGoogleApiClient.connect(); 
      } 
     } 
    } 

    @Override 
    public void onClick(View view) { 
     if (view.getId() == R.id.sign_in_button 
       && !mGoogleApiClient.isConnecting()) { 
      mSignInClicked = true; 
      resolveSignInErrors(); 
     } 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult result) { 
     if (!mIntentInProgress) { 
      mConnectionResult = result; 

      if (mSignInClicked) { 
       resolveSignInErrors(); 
      } 
     } 
    } 

    private void resolveSignInErrors() { 
     if (mConnectionResult.hasResolution()) { 
      try { 
       mIntentInProgress = true; 
       mConnectionResult.startResolutionForResult(this, RC_SIGN_IN); 
      } catch (SendIntentException e) { 
       mIntentInProgress = false; 
       mGoogleApiClient.connect(); 
      } 
     } 
    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
     mSignInClicked = false; 
     navigateToMainActivity(); 
     Toast.makeText(this, "User is connected!", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onConnectionSuspended(int cause) { 
     mGoogleApiClient.connect(); 
    } 

    public void navigateToMainActivity() { 
     Intent intent = new Intent(LoginActivity.this, MainActivity.class); 
     startActivity(intent); 
    } 
} 

當我啓動應用程序,它加載到登錄屏幕。當我點擊登錄按鈕時,應用會無限次地返回到我們的LoginActivity。

+0

通過首先問一個問題可能會冒險 - 您是否需要定義與ggole plus連接時要啓動的活動? (和facebook上的一樣),如果你斷開連接後可能會回到在g +中定義的主要活動,則你的循環是g +連接位置(onCreate)的直接結果,這意味着你正在連接重定向到接下來的活動,然後斷開連接,然後重新引導回那只是一個GUESS,雖然... – crazyPixel

+0

我不知道另一種方式來處理兩個單獨的屏幕(一個登錄,另一個主要)沒有2個活動 –

+0

我可能沒有解釋我自己 - 做您需要定義連接時啓動的活動\您正在使用Google plus連接的活動(假設您需要創建一個ggole plus應用程序)? – crazyPixel

回答

1

不幸的是,我沒有時間分析你的情況,但我從我的應用程序中刪除了一段代碼,它做了類似的事情。它與Google雲端硬盤相關,但很容易適應。
在菜單選項上,它彈出帳戶選擇器並使用所選帳戶連接到GAC。我迅速剝離了大量的代碼,並希望我不會把它搞得太多。 檢查用戶是否登錄與我的情況無關。如果之前連接了有效的用戶,則connect()成功,否則會彈出帳戶選擇器。 SO 21610239有更多關於它的信息。我相信沒有辦法獲得當前簽名用戶,除非您彈出帳戶選擇器並從返回(下面的KEY_ACCOUNT_NAME)中獲取。

public class SomeActivity extends Activity 
           implements ConnectionCallbacks, OnConnectionFailedListener { 
    GoogleApiClient mGAC; 
    // from menu: user pops up account picker and selects account 
    @Override public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.acc_select: 
     Intent intent = AccountPicker.newChooseAccountIntent(null, null, 
       new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, false, null, null, null, null); 
     startActivityForResult(intent, AUTH_REQUEST); 
    return true; 
    } 
    return super.onOptionsItemSelected(item); 
    } 
    // back from account picker (invoked from menu OR from onConnectionFailed()) 
    @Override protected void onActivityResult(final int rqst, final int rslt, final Intent it) { 
    switch (rqst) { 
    case AUTH_REQUEST:          
     if (mGAC == null) { 
     mGAC = new GoogleApiClient.Builder(this).addApi(Drive.API).addScope(Drive.SCOPE_FILE) 
     .setAccountName(it.getStringExtra(AccountManager.KEY_ACCOUNT_NAME)) 
     .addConnectionCallbacks(this).addOnConnectionFailedListener(this).build(); 
     } 
     if ((mGAC != null) && !mGAC.isConnected()) 
     mGAC.connect(); 
     break; 
    } 
    } 
    // connection failed, either fatal, or needs account/authorization 
    @Override public void onConnectionFailed(ConnectionResult rslt) { 
    if (!rslt.hasResolution()) {  // FATAL ------->>>> 
     Toast.makeText(this, "FAILED", Toast.LENGTH_LONG).show(); 
    } else try {      // needs authorization 
     rslt.startResolutionForResult(this, AUTH_REQUEST); 
    } catch (SendIntentException e) {} 
    } 
    @Override public void onConnected(Bundle connectionHint) { 
    // do my stuff here 
    } 
    @Override public void onConnectionSuspended(int i) {} 
} 
+0

我認爲如果向Builder中添加'.addApi(Plus.API)',然後調用'Plus.Account.getAccountName()',您可以獲取帳戶名稱,但它仍然需要Android'GET_ACCOUNTS'權限。 – Hounshell

+0

@Hounshell。這可能是特定於Plus.API(即正確應用於此特定問題)。我在Drive.API領域工作,並且沒有可用的「Drive.Account」。可能遺漏在Drive API中。您的解決方案可能會讓它變得更容易,應用程序無需保留帳戶電子郵件。 – seanpj

+0

是的,它特定於Plus,但我認爲如果您添加Plus.API而沒有任何範圍,則可以使用該方法,而不要求用戶獲取額外的權限。 – Hounshell

0

有一個明顯的問題,我在您發佈的代碼中看到:

mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addApi(Plus.API, null).addScope(Plus.SCOPE_PLUS_LOGIN).build(); 

    if (!mGoogleApiClient.isConnected()) { 
     Intent intent = new Intent(MainActivity.this, LoginActivity.class); 
     startActivity(intent); 
    } 

此時mGoogleApiClient將永遠不會被連接。要確定用戶是否沒有成功連接(可能有多種原因),您需要將OnConnectionFailedListener添加到Builder,然後在mGoogleApiClient上調用.connect(),並等待OnConnectionFailedListener#onConnectionFailed()被調用。如果發生這種情況,那麼將用戶重定向到登錄活動。

+0

我已經發布的答案包含您提到的所有項目: 「實現OnConnectionFailedListener」,「.addOnConnectionFailedListener(this)」,「@Override public void onConnectionFailed(ConnectionResult rslt)」。 我們是否在同一個宇宙? – seanpj