2013-08-29 45 views
7

我有一些問題,這此鏈接說說:第一 Google plus client "An internal error occured" 但最新的一個不usful對我來說, : "An internal error occurred" with integration of Google Plus Login 而這個鏈接鏈接有人建議此解決方案: 當您未在API控制檯項目中爲客戶端ID設置簽名,或者您從密鑰工具複製了錯誤的密鑰值時,可能會發生這種情況:Android的登錄通過谷歌,加上「一個內部錯誤」

但我爲客戶端設置了簽名ID作爲此鏈接中的說明: https://developers.google.com/+/quickstart/android#install-sdk

我從導出項目生成SHA1並從控制檯取SHA1。

和我創建的客戶端ID,並把包名和SHA1

,當我按簽到按鈕我收到此吐司消息:「發生內部錯誤」

請我需要的任何想法如何解決這個問題

終於這是我的代碼

public class GoogleActivity extends Activity implements 
ConnectionCallbacks, OnConnectionFailedListener, OnClickListener, 
OnAccessRevokedListener, PlusClient.OnPersonLoadedListener { 

private static final String TAG = "SignInTestActivity"; 

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

// 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; 

// Person information. 
String firstName,lastName,Nationality,gender,email,birthDay; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_google); 
// 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) 
     .setVisibleActivities("http://schemas.google.com/BuyActivity") 
     .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.button1).setOnClickListener(this); 
findViewById(R.id.button2).setOnClickListener(this); 
findViewById(R.id.button3).setOnClickListener(this); 
findViewById(R.id.button2).setVisibility(View.INVISIBLE); 
findViewById(R.id.button3).setVisibility(View.INVISIBLE); 

// 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"); 
// 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()) { 
    mConnectionResult = result; 
    if (mResolveOnFail) { 
     // 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) { 
//--- We can get the oAuth 2.0 access token we are using. 
Log.v(TAG, "Connected."); 

// 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.button1).setVisibility(View.INVISIBLE); 
findViewById(R.id.button2).setVisibility(View.VISIBLE); 
findViewById(R.id.button3).setVisibility(View.VISIBLE); 
String accountName = mPlusClient.getAccountName(); 

//-- fetch person info 
mPlusClient.loadPerson(this, "me"); 

Toast.makeText(this, accountName + " is connected.", Toast.LENGTH_LONG).show(); 

// 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); 
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.button1: 
    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; 
case R.id.button2: 
    Log.v(TAG, "Tapped sign out"); 
    // We only want to sign out if we're connected. 
    if (mPlusClient.isConnected()) { 
     // Clear the default account in order to allow the user 
     // to potentially choose a different account from the 
     // account chooser. 
     mPlusClient.clearDefaultAccount(); 

     // Disconnect from Google Play Services, then reconnect in 
     // order to restart the process from scratch. 
     mPlusClient.disconnect(); 
     mPlusClient.connect(); 

     // Hide the sign out buttons, show the sign in button. 
     findViewById(R.id.button1).setVisibility(View.VISIBLE); 
     findViewById(R.id.button2) 
       .setVisibility(View.INVISIBLE); 
     findViewById(R.id.button3).setVisibility(
       View.INVISIBLE); 
    } 
    break; 
case R.id.button3: 
    Log.v(TAG, "Tapped disconnect"); 
    if (mPlusClient.isConnected()) { 
     // Clear the default account as in the Sign Out. 
     mPlusClient.clearDefaultAccount(); 

     // Go away and revoke access to this entire application. 
     // This will call back to onAccessRevoked when it is 
     // complete as it needs to go away to the Google 
     // authentication servers to revoke all token. 
     mPlusClient.revokeAccessAndDisconnect(this); 
    } 
    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.button1).setVisibility(View.VISIBLE); 
findViewById(R.id.button2).setVisibility(View.INVISIBLE); 
findViewById(R.id.button3).setVisibility(View.INVISIBLE); 
} 

/** 
* A helper method to flip the mResolveOnFail flag and start the resolution 
* of the ConnenctionResult from the failed connect() call. 
*/ 

private void startResolution() { 
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(); 
} 
} 

@Override 
public void onPersonLoaded(ConnectionResult status, Person person) { 
// TODO Auto-generated method stub 

//fetch(status, person);  
try 
{ 
if (status.getErrorCode() == ConnectionResult.SUCCESS) 
{ 
    Log.d(TAG, "Display Name: " + person.getDisplayName()); 

    firstName = person.getName().getGivenName(); 
    Toast.makeText(this, firstName, Toast.LENGTH_LONG).show(); 

    lastName = person.getName().getFamilyName(); 
    Toast.makeText(this, lastName, Toast.LENGTH_LONG).show(); 


    if(person.getGender() == 0) 
     gender = "male"; 
    else if(person.getGender() == 1) 
     gender = "female"; 
    else 
     gender = "other"; 
    Toast.makeText(this, gender, Toast.LENGTH_LONG).show(); 


    List<Person.PlacesLived> cites =person.getPlacesLived(); 
    if(cites!=null) 
    { 
     Nationality = cites.get(0).toString(); 
     Toast.makeText(this, Nationality, Toast.LENGTH_LONG).show(); 
    } 
    else 
     Toast.makeText(this, "Null Nationality", Toast.LENGTH_LONG).show(); 

    birthDay = person.getBirthday(); 
    Toast.makeText(this, birthDay, Toast.LENGTH_LONG).show(); 

    List<Emails> emails = person.getEmails(); 
    if(emails !=null) 
    { 
     email = emails.get(0).getValue(); 
     Toast.makeText(this, email, Toast.LENGTH_LONG).show(); 
    } 
    else 
     Toast.makeText(this, person.getDisplayName(), Toast.LENGTH_LONG).show(); 

    /*TextView name =(TextView) findViewById(R.id.textView1); 
    TextView Gender =(TextView) findViewById(R.id.textView2); 
    TextView mail =(TextView) findViewById(R.id.textView3); 
    TextView BD =(TextView) findViewById(R.id.textView4); 
    TextView Current =(TextView) findViewById(R.id.textView5); 

    name.setText(person.getName().getFamilyName()); 
    Gender.setText(person.getGender()); 
    mail.setText(person.getEmails().get(0).toString()); 
    BD.setText(person.getBirthday()); 
    Current.setText(person.getCurrentLocation());*/ 

} 
else 
    Toast.makeText(this, "no result", Toast.LENGTH_LONG).show(); 
} 
catch(Exception e) 
{ 
    Toast.makeText(this, "error", Toast.LENGTH_LONG).show(); 
} 
} 

}

+0

也解決了,當我運行谷歌,加上樣品I面臨同樣的TOA消息 儘管我爲它創建了新的客戶端ID並添加了SHA1 請問需要幫助,我該怎麼辦? – sham

回答

2

我解決了這個問題監守我不是通過獲取APK文件上運行通過手機項目時,我應通過獲取apk文件運行的項目,我必須從導出的文件中得到SHA從CMD無法從導出的文件獲得SHA

+0

從cmd獲取SHA?你能澄清一下嗎? – l33t

+0

在Eclipse上測試時,您需要從命令行獲取證書的SHA-1指紋:在終端中,通過編寫以下代碼運行Keytool實用程序: keytool -exportcert -alias androiddebugkey -keystore〜/ .android/debug.keystore -list -v •按回車鍵 •密碼:安卓 •按回車 •SHA1哈希 – sham

+0

應更換此副本:〜/ .android/debug.keystore >>你debug.keystore在您的設備上的位置 – sham

0

我有這個相同的錯誤信息。我的問題是通過改變

.setScopes( 「PLUS_LOGIN」)

.setScopes(Scopes.PLUS_LOGIN)