2013-03-04 10 views
7

Chcę mieć login Google Plus w mojej aplikacji. Mogłem połączyć ale w stanie uzyskać informacje o profilu bieżącego użytkownikaGoogle-plus: nie można załadować osoby

@Override 
public void onConnected() { 

    String accountName = mPlusClient.getAccountName(); 

    mPlusClient.loadPerson(this, "me"); 
} 

@Override 
public void onPersonLoaded(ConnectionResult status, Person person) { 

    Log.d("onPersonLoaded - ConnectionResult", "" + status); 
    Log.d("onPersonLoaded - person", "" + person); 
    if (status.getErrorCode() == ConnectionResult.SUCCESS) { 
     Log.d(TAG, "Display Name: " + person.getDisplayName()); 
    } 
} 

mogłem dostać nazwę konta w onConnected Ale onPersonLoaded daje null dla person

Dzienniki przedstawiają:

onPersonLoaded - ConnectionResult(29861): ConnectionResult{statusCode=NETWORK_ERROR, resolution=null} 
onPersonLoaded - person(29861): null 

Od dokumenty here

publiczny końcowy statyczny int NETWORK_ERROR

Wystąpił błąd sieciowy. Ponowna próba powinna rozwiązać problem.

Stała Wartość: 7 (0x00000007)

Ale pojawia się ten sam błąd bez względu na to, ile razy powtórzyć. I to jest pozwolenie, którego używam:

<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /> 
<uses-permission android:name="android.permission.READ_PROFILE" /> 

Nie mam pojęcia, jak rozwiązać ten problem i szukałem w ciągu ostatnich 2 godzin. Każda pomoc jest bardzo ceniona, dziękuję.

+0

nie masz to działa? Mam do czynienia z tym samym problemem, czy możesz mi w tym pomóc? jeśli nie znalazłeś odpowiedzi, podziel się swoim kodem aktywności. –

+0

Niestety, nie mogłem znaleźć rozwiązania powyższego problemu. Ale mógłbym osiągnąć to samo, stosując inne podejście. Sprawdź moją odpowiedź poniżej. – user1537779

+0

na szczęście znalazłem rozwiązanie. proszę spojrzeć i zaakceptować jako odpowiedź, jeśli uważasz, że jest to poprawne, na korzyść innych ludzi. –

Odpowiedz

13

w końcu znalazłem odpowiedź. :)

loadPerson() i loadPeople() zwróci oczekiwane dane tylko w wyeksportowanym pliku APK podpisanym prawidłowym kluczem. przez ważne tutaj oznacza to, że powinien on pasować do SHAI i innych specyfikacji twojego API key console.

jeszcze jedno można przegapić kiedy po sample code jest określić zakres w konstruktorze PlusClient, jak

mPlusClient = new PlusClient.Builder(this, this, this).setScopes(Scopes.PLUS_LOGIN) 
       .setVisibleActivities("http://schemas.google.com/AddActivity").build(); 
+0

masz na myśli podpisać apk używając jarsignera? – dd619

+0

mam na myśli za pomocą keytool lub za pomocą eclipse eksportowany podpisany apk wizard –

+0

dlaczego mPlusClient.Builder (....) zwróci wartość null? –

4
private class connectAsyncTask extends AsyncTask<String, Void, String> { 

    String sAccessToken = null; 

    @Override 
    protected void onPostExecute(String info) { 

     Log.d("JSONData = ", "" + info); 
     //This contains all the data you wanted. 
    } 

    @Override 
    protected String doInBackground(String... params) { 

     HttpURLConnection urlConnection = null; 
     try { 
      URL url = new URL(
        "https://www.googleapis.com/oauth2/v1/userinfo"); 
      sAccessToken = GoogleAuthUtil 
        .getToken(
          MainActivity.this, 
          mPlusClient.getAccountName() + "", 
          "oauth2:" 
            + Scopes.PLUS_PROFILE 
            + " https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email"); 

      //This is probably not the right way to do. 
      //What I am doing here is, get an AccessToken, invalidate it and get a new 
      //AccessToken again. Because I couldn't find a way to check whether the 
      //AccessToken is expired or not. 

      GoogleAuthUtil.invalidateToken(MainActivity.this, sAccessToken); 

      sAccessToken = GoogleAuthUtil 
        .getToken(
          MainActivity.this, 
          mPlusClient.getAccountName() + "", 
          "oauth2:" 
            + Scopes.PLUS_PROFILE 
            + " https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email"); 

      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestProperty("Authorization", "Bearer " 
        + sAccessToken); 

      BufferedReader r = new BufferedReader(new InputStreamReader(
        urlConnection.getInputStream(), "UTF-8")); 
      StringBuilder total = new StringBuilder(); 
      String line; 
      while ((line = r.readLine()) != null) { 
       total.append(line); 
      } 
      line = total.toString(); 
      if (!TextUtils.isEmpty(line)) { 
       return line; 
      } else { 
       return null; 
      } 
     } catch (UserRecoverableAuthException userAuthEx) { 
      // Start the user recoverable action using the intent returned 
      // by getIntent() 

      userAuthEx.printStackTrace(); 
      mActivity.this.startActivityForResult(
        userAuthEx.getIntent(), MY_ACTIVITYS_AUTH_REQUEST_CODE); 
      return null; 
     } catch (FileNotFoundException e) { 
      //You get this exception when the AccessToken is expired. 
      //I don't know how its a FileNotFoundException 
      //Thats why instead of relying on this, I did the above to get 
      //new AccessToken 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } finally { 
      if (urlConnection != null) { 
       urlConnection.disconnect(); 
      } 
     } 
    } 

    @Override 
    protected void onPreExecute() { 
    } 
} 
+0

jaki ciąg znaków przekazujesz do metody wykonywania w czasie wywoływania asynctask? –

+1

Nic właściwie. Ponieważ mój 'mPlusClient' jest zmienną klasy, mogę uzyskać do niej dostęp w AsyncTask, aby uzyskać' AccountName'. Ale faktycznie powinienem przekazać 'mPlusClient.getAccountName()' jako ciąg podczas wykonywania. I to wszystko, czego potrzebujesz, aby uzyskać 'AccessToken' i wszystkie dane później – user1537779

+0

Pomógł mi dużo. Dzięki, koleś :) –

Powiązane problemy