我想在我的应用程序中登录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 :(得分: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();
答案 1 :(得分: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() {
}
}