Android - 如何获取 google plus 访问令牌?

Posted

技术标签:

【中文标题】Android - 如何获取 google plus 访问令牌?【英文标题】:Android - how to get google plus access token? 【发布时间】:2014-07-08 16:46:46 【问题描述】:

您好,我在不使用 OAuth 2.0 客户端 ID 和范围的情况下获取 google plus 访问令牌。但是使用此访问令牌不会获取电子邮件地址。如何获取用户邮箱?

带有和不带有 OAuth 2.0 客户端 ID 的 accesstoken 有什么区别吗?

我使用了以下代码,

String accessToken="";
                    try 
                        accessToken = GoogleAuthUtil.getToken(
                                getApplicationContext(),
                                mPlusClient.getAccountName(), "oauth2:"
                                        + Scopes.PLUS_LOGIN + " "
                                        + Scopes.PLUS_PROFILE);

                        System.out.println("Access token==" + accessToken);
                     catch (Exception e) 
                        e.printStackTrace();
                    

【问题讨论】:

显示一些你尝试过的代码。 请检查更新的问题 你遇到了什么异常? 没有例外,但是,使用此访问代码,我在服务器端获取用户的个人资料信息而没有电子邮件 ID 这意味着您正在获取访问令牌? 【参考方案1】:
String accessToken = "";
try 
  URL url = new URL("https://www.googleapis.com/oauth2/v1/userinfo");
  // get Access Token with Scopes.PLUS_PROFILE
  String sAccessToken;
  sAccessToken = GoogleAuthUtil.getToken(
    LoginCheckActivity.this,
    mPlusClient.getAccountName() + "",
    "oauth2:"
      + Scopes.PLUS_PROFILE + " "
      + "https://www.googleapis.com/auth/plus.login" + " "
      + "https://www.googleapis.com/auth/plus.profile.emails.read");
 catch (UserRecoverableAuthException e) 
  // TODO Auto-generated catch block
  e.printStackTrace();                  
  Intent recover = e.getIntent();
  startActivityForResult(recover, 125);
  return "";
 catch (IOException e) 
  // TODO Auto-generated catch block
  e.printStackTrace();
 catch (GoogleAuthException e) 
  // TODO Auto-generated catch block
  e.printStackTrace();

【讨论】:

@Deprecated public static String getToken(Context var0, String var1, String var2)【参考方案2】:

有两种简单的方法可以从 Google plus 获取用户电子邮件,

1.通过Plus.AccountApi.getAccountName,如下所示,

String email = Plus.AccountApi.getAccountName(mGoogleApiClient);

2.通过plus.profile.emails.read scope and REST end point,如下所示,

获取 GooglePlus AccessToken

您需要传递 " https://www.googleapis.com/auth/plus.profile.emails.read" 这个范围才能从 GooglePlus 获取 AccessToken,如下所示,

accessToken = GoogleAuthUtil.getToken(
                                getApplicationContext(),
                                mPlusClient.getAccountName(), "oauth2:"
                                        + Scopes.PLUS_LOGIN + " "
                                        + Scopes.PLUS_PROFILE+" https://www.googleapis.com/auth/plus.profile.emails.read");

对端点进行 REST 调用并进行简单的 JSON 解析

https://www.googleapis.com/plus/v1/people/me?access_token=XXXXXXXXXXXXX

您必须在androidManifest.xml 中声明权限<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 才能使用这些方法。

来自 Google 开发者网站的完整示例,

执行以下操作从 Google plus 检索经过身份验证的用户的电子邮件,

class UserInfo 
  String id;
  String email;
  String verified_email;


final String account = Plus.AccountApi.getAccountName(mGoogleApiClient);

AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() 

  @Override
  protected UserInfo doInBackground(Void... params) 
    HttpURLConnection urlConnection = null;

    try 
      URL url = new URL("https://www.googleapis.com/plus/v1/people/me");
      String sAccessToken = GoogleAuthUtil.getToken(EmailTest.this, account,
        "oauth2:" + Scopes.PLUS_LOGIN + " https://www.googleapis.com/auth/plus.profile.emails.read");

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

      String content = CharStreams.toString(new InputStreamReader(urlConnection.getInputStream(),
          Charsets.UTF_8));

      if (!TextUtils.isEmpty(content)) 
        JSONArray emailArray =  new JSONObject(content).getJSONArray("emails");

        for (int i = 0; i < emailArray.length; i++) 
          JSONObject obj = (JSONObject)emailArray.get(i);

          // Find and return the primary email associated with the account
          if (obj.getString("type") == "account") 
            return obj.getString("value");
          
        
      
     catch (UserRecoverableAuthException userAuthEx) 
      // Start the user recoverable action using the intent returned by
      // getIntent()
      startActivityForResult(userAuthEx.getIntent(), RC_SIGN_IN);
      return;
    catch (Exception e) 
      // Handle error
      // e.printStackTrace(); // Uncomment if needed during debugging.
     finally 
      if (urlConnection != null) 
        urlConnection.disconnect();
      
    

    return null;
  

  @Override
  protected void onPostExecute(String info) 
      // Store or use the user's email address
  

;

task.execute();

更多信息请阅读本文

https://developers.google.com/+/mobile/android/people

【讨论】:

我已经用更多信息编辑了我的答案。希望对您有所帮助。

以上是关于Android - 如何获取 google plus 访问令牌?的主要内容,如果未能解决你的问题,请参考以下文章

Android - 如何获取 google plus 访问令牌?

如何在 Android 上获取 google 用户名?

如何从 Android 上的 Google 地图共享 url 获取坐标

如何在android中获取google plus的刷新令牌?

如何通过滑行在 Google 地图上的 infoWindow 中获取图像 - Android

gsutil - 如何从 google play 获取 Android 应用审查报告