2014-02-05 3 views
0

알았어, 나는 며칠 동안이 문제를 겪어 왔고 G +를 내 앱에 연결할 수없는 것으로 보입니다. Android Studio 0.4.3을 사용하고 있습니다. 나는 this 튜토리얼을 Google에서 T에게 제공했지만 운이 없었습니다. 내 코드는 현재 this example과 닮았습니다. 내가 시도하는 것은 아무것도 작동하지 않는 것 같습니다. this question, this question, this question과 같은 스택 질문이나 다른 포럼과 비슷한 질문을 한 번 보았습니다. OAuth 2.0 코드 설정을 위해 the tutorial을 추적했지만 여전히 '내부 오류'토스트를받습니다.Android Studio PlusClient "내부 오류"

import com.crashlytics.android.Crashlytics; 
import java.io.IOException; 

import com.google.android.gms.auth.GoogleAuthException; 
import com.google.android.gms.auth.GoogleAuthUtil; 
import com.google.android.gms.auth.UserRecoverableAuthException; 
import com.google.android.gms.common.Scopes; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks; 
import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener; 
import com.google.android.gms.plus.PlusClient; 
import com.google.android.gms.plus.PlusClient.OnAccessRevokedListener; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentSender.SendIntentException; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Toast; 

public class LogIn extends Activity implements 
    ConnectionCallbacks, OnConnectionFailedListener, OnClickListener, 
    OnAccessRevokedListener { 

private static final String TAG = "SignInTestActivity"; 

static final String[] SCOPES = new String[] { Scopes.PLUS_LOGIN }; 

// A magic number we will use to know that our sign-in error 
// resolution activity has completed. 
private static final int OUR_REQUEST_CODE = 9000; 

// The core Google+ client. 
private PlusClient mPlusClient; 

// A flag to stop multiple dialogues appearing for the user. 
private boolean mResolveOnFail; 

// We can store the connection result from a failed connect() 
// attempt in order to make the application feel a bit more 
// responsive for the user. 
private ConnectionResult mConnectionResult; 

// A progress dialog to display when the user is connecting in 
// case there is a delay in any of the dialogs being ready. 
private ProgressDialog mConnectionProgressDialog; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 
    // We pass through this for all three arguments, specifying the: 
    // 1. Context 
    // 2. Object to call onConnected and onDisconnected on 
    // 3. Object to call onConnectionFailed on 
    mPlusClient = new PlusClient.Builder(this, this, this) 
      .setActions("http://schemas.google.com/AddActivity", "http://schemas.google.com/BuyActivity") 
      .setScopes(Scopes.PLUS_LOGIN) // recommended login scope for social features 
     // .setScopes("profile")  // alternative basic login scope 
      .build(); 

    // We use mResolveOnFail as a flag to say whether we should trigger 
    // the resolution of a connectionFailed ConnectionResult. 
    mResolveOnFail = false; 

    // Connect our sign in, sign out and disconnect buttons. 
    findViewById(R.id.sign_in_button).setOnClickListener(this); 

    // Configure the ProgressDialog that will be shown if there is a 
    // delay in presenting the user with the next sign in step. 
    mConnectionProgressDialog = new ProgressDialog(this); 
    mConnectionProgressDialog.setMessage("Signing in..."); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    Log.v(TAG, "Start"); 
    // Every time we start we want to try to connect. If it 
    // succeeds we'll get an onConnected() callback. If it 
    // fails we'll get onConnectionFailed(), with a result! 
    mPlusClient.connect(); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    Log.v(TAG, "Stop"); 
    // It can be a little costly to keep the connection open 
    // to Google Play Services, so each time our activity is 
    // stopped we should disconnect. 
    mPlusClient.disconnect(); 
} 

@Override 
public void onConnectionFailed(ConnectionResult result) { 
    Log.v(TAG, "ConnectionFailed"); 
    Toast.makeText(this, "connection failed", Toast.LENGTH_SHORT).show(); 
    // Most of the time, the connection will fail with a 
    // user resolvable result. We can store that in our 
    // mConnectionResult property ready for to be used 
    // when the user clicks the sign-in button. 
    if (result.hasResolution()) { 
     Toast.makeText(this, "has resolution - "+result, Toast.LENGTH_SHORT).show(); 
     mConnectionResult = result; 
     if (mResolveOnFail) { 
      Toast.makeText(this, "resolveOnFail", Toast.LENGTH_SHORT).show(); 
      // This is a local helper function that starts 
      // the resolution of the problem, which may be 
      // showing the user an account chooser or similar. 
      startResolution(); 
     } 
    } 
} 

@Override 
public void onConnected(Bundle bundle) { 
    // Yay! We can get the oAuth 2.0 access token we are using. 
    Log.v(TAG, "Connected. Yay!"); 
    String accountName = mPlusClient.getAccountName(); 
    Toast.makeText(this, accountName + " is connected.", Toast.LENGTH_LONG).show(); 

    // Turn off the flag, so if the user signs out they'll have to 
    // tap to sign in again. 
    mResolveOnFail = false; 

    // Hide the progress dialog if its showing. 
    mConnectionProgressDialog.dismiss(); 

    // Hide the sign in button, show the sign out buttons. 
    findViewById(R.id.sign_in_button).setVisibility(View.INVISIBLE); 

    // Retrieve the oAuth 2.0 access token. 
    final Context context = this.getApplicationContext(); 
    AsyncTask task = new AsyncTask() { 
     @Override 
     protected Object doInBackground(Object... params) { 
      String scope = "oauth2:" + Scopes.PLUS_LOGIN; 
      try { 
       // We can retrieve the token to check via 
       // tokeninfo or to pass to a service-side 
       // application. 
       String token = GoogleAuthUtil.getToken(context, 
         mPlusClient.getAccountName(), scope); 
      } catch (UserRecoverableAuthException e) { 
       // This error is recoverable, so we could fix this 
       // by displaying the intent to the user. 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (GoogleAuthException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 
    }; 
    task.execute((Void) null); 
} 

@Override 
public void onDisconnected() { 
    // Bye! 
    Log.v(TAG, "Disconnected. Bye!"); 
} 

protected void onActivityResult(int requestCode, int responseCode, Intent intent) { 
    Log.v(TAG, "ActivityResult: " + requestCode); 
    Toast.makeText(this, "ActivityResult: " + requestCode+" -- "+responseCode+" "+RESULT_OK, Toast.LENGTH_LONG).show(); 

    if (requestCode == OUR_REQUEST_CODE && responseCode == RESULT_OK) { 
     // If we have a successful result, we will want to be able to 
     // resolve any further errors, so turn on resolution with our 
     // flag. 
     mResolveOnFail = true; 
     // If we have a successful result, lets call connect() again. If 
     // there are any more errors to resolve we'll get our 
     // onConnectionFailed, but if not, we'll get onConnected. 
     mPlusClient.connect(); 
    } else if (requestCode == OUR_REQUEST_CODE && responseCode != RESULT_OK) { 
     // If we've got an error we can't resolve, we're no 
     // longer in the midst of signing in, so we can stop 
     // the progress spinner. 

     mConnectionProgressDialog.dismiss(); 
    } 
} 

@Override 
public void onClick(View view) { 
    switch (view.getId()) { 
     case R.id.sign_in_button: 
      Log.v(TAG, "Tapped sign in"); 
      if (!mPlusClient.isConnected()) { 
       // Show the dialog as we are now signing in. 
       mConnectionProgressDialog.show(); 
       // Make sure that we will start the resolution (e.g. fire the 
       // intent and pop up a dialog for the user) for any errors 
       // that come in. 
       mResolveOnFail = true; 
       // We should always have a connection result ready to resolve, 
       // so we can start that process. 
       if (mConnectionResult != null) { 
        startResolution(); 
       } else { 
        // If we don't have one though, we can start connect in 
        // order to retrieve one. 
        mPlusClient.connect(); 
       } 
      } 
      break; 
     default: 
      // Unknown id. 
    } 
} 

@Override 
public void onAccessRevoked(ConnectionResult status) { 
    // mPlusClient is now disconnected and access has been revoked. 
    // We should now delete any data we need to comply with the 
    // developer properties. To reset ourselves to the original state, 
    // we should now connect again. We don't have to disconnect as that 
    // happens as part of the call. 
    mPlusClient.connect(); 

    // Hide the sign out buttons, show the sign in button. 
    findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE); 
} 

/** 
* A helper method to flip the mResolveOnFail flag and start the resolution 
* of the ConnenctionResult from the failed connect() call. 
*/ 
private void startResolution() { 
    Toast.makeText(this, "resolving", Toast.LENGTH_SHORT).show(); 
    try { 
     // Don't start another resolution now until we have a 
     // result from the activity we're about to start. 
     mResolveOnFail = false; 
     // If we can resolve the error, then call start resolution 
     // and pass it an integer tag we can use to track. This means 
     // that when we get the onActivityResult callback we'll know 
     // its from being started here. 
     mConnectionResult.startResolutionForResult(this, OUR_REQUEST_CODE); 
    } catch (SendIntentException e) { 
     // Any problems, just try to connect() again so we get a new 
     // ConnectionResult. 
     mPlusClient.connect(); 
    } 
} 
} 
+0

없음 외부 링크하시기 바랍니다, 그리고 간결하고 정확한 설명을 자체 해결 듯 ** 관련 ** 코드로만 설명 된 문제의 사람들이 대답하기를 기대할 때 질문을 쓰는 데 약 10 배의 노력을 기울여야합니다. 개인적으로 외부 링크 (내 코드를 보려면 여기를 클릭하십시오) 또는 많은 링크 또는 코드를 볼 경우 다음 질문으로 이동하십시오. – Simon

+0

@Simon이 코드에는 모든 코드가 있지만, 코드가 올바르게 포맷되지 않았기 때문에 모든 것을 pastebin으로 옮겼습니다. 외부 링크 죄송합니다. 나는 내가 만든 다른 모든 실을 본다. 내 직관이 대개 매우 자세하다. 나는 문제가 발생했을 때 그것을 설명했다. 추가 할 세부 정보가 있습니까? – xxstevenxo

+0

@Simon 사람들은 보통 이와 같은 오류가있는 코드 단편이있을 때 불평을합니다. 그래서 저는 전체 코드를 pastebin에 제공했습니다. – xxstevenxo

답변

0

내가 잘못 뭔지 정말 모르겠어요,하지만 난 처음부터 다시 시작하기로 결정하고 문제가 -_-