2013-03-04 3 views
7

Я хочу иметь логин Google Plus в своем приложении. Я мог бы подключиться, но не может получить информацию о профиле текущего пользователяGoogle-plus: не удалось загрузить человека

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

я мог получить имя учетной записи в onConnected Но onPersonLoaded дает null для person

Журналы показывают:

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

С документы here

public static final int NETWORK_ERROR

Произошла сетевая ошибка. Повторная попытка должна решить проблему.

Константа Значение: 7 (0x00000007)

Но я получаю ту же ошибку, независимо от того, сколько раз я повторить. И это разрешение, которое я использую:

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

Я не знаю, как решить эту проблему и искал последние 2 часа. Любая помощь очень ценится, спасибо.

+0

вы получили это работает? Я столкнулся с такой же проблемой, не могли бы вы помочь мне в этом? если вы не нашли ответ, поделитесь своим кодом активности. –

+0

Извините, я не смог найти решение проблемы. Но я мог бы достичь того же, используя другой подход. Проверьте мой ответ ниже. – user1537779

+0

К счастью, я нашел решение. пожалуйста, взгляните и согласитесь в качестве ответа, если вы считаете его правильным, в интересах других людей. –

ответ

13

окончательно я нашел ответ. :)

loadPerson() и loadPeople() вернет вам ожидаемые данные только в экспортированном APK, подписанном действующим ключом. здесь я имею в виду, что он должен соответствовать SHAI и другим спецификациям вашего API key console.

еще одна вещь, которую вы могли бы пропустили, когда после sample code это определить область в PlusClient конструктору,

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

Вы имеете в виду знак apk с помощью jarsigner? – dd619

+0

Я имею в виду знак с помощью keytool или с использованием экспорта eclipse, подписанного apk wizard –

+0

Почему mPlusClient.Builder (....) возвращает 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

какую строку вы передаете для выполнения метода во время вызова asynctask? –

+1

Ничего. Поскольку мой 'mPlusClient' является переменной класса, я могу получить доступ к нему внутри AsyncTask, чтобы получить' AccountName'. Но в действительности я должен был передать 'mPlusClient.getAccountName()' как строку при выполнении. И это все, что вам нужно, чтобы получить «AccessToken» и все данные позже. – user1537779

+0

Помогло мне много. Спасибо dude :) –

Смежные вопросы