2

我正在开发一种多用户 Android 应用程序,该应用程序向其用户提供对 GMaps 的访问(互相查找)、聊天等。用户应该使用他们在 Twitter、Facebook、Google+ 等上的帐户登录到应用程序。除 G+ 之外的所有帐户都可以正常工作 - 应用程序只能使用其所有者帐户访问 G+ API。对于其他帐户,我收到 com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found 或“授权错误”。App在API Console上注册,使用OAuth2.0认证。我使用来自 Google 网站的标准身份验证机制。是否可以使用不同的 G+ 帐户登录?这是我的代码(Android v1.6):

public class GooglePlusActivity extends Activity {

public static final String LOG_TAG = GooglePlusActivity.class.getSimpleName();
public static final String EXTRA_FIRSTNAME = "firstname";
public static final String EXTRA_LASTNAME = "lastname";
public static final String EXTRA_NICKNAME = "nickname";
public static final String EXTRA_SEX = "sex";
public static final String EXTRA_AVATAR = "avatar";
public static final String EXTRA_ID_SOCNET = "id_socnet";

private ApplicationSettings mSettings;
private Person mProfile;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mSettings = ((TomskApplication)getApplication()).getSettings();
    signIn();
}

private void signIn() {
    WebView webView = new WebView(this);
    setContentView(webView);
    webView.getSettings().setJavaScriptEnabled(false);
    String googleAuthorizationRequestUrl = new GoogleAuthorizationRequestUrl(
            mSettings.getGPID(), mSettings.getGPRedirectURI(),
            mSettings.getGPScope()).build();
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url){
            if (url.startsWith(mSettings.getGPRedirectURI())) {
                try {
                    Intent res_intent = new Intent();
                    if (url.indexOf("code=") != -1) {
                        String code = url.substring(mSettings
                                .getGPRedirectURI().length() + 7, url
                                .length());

                        AccessTokenResponse token = new GoogleAuthorizationCodeGrant(
                                new NetHttpTransport(),
                                new JacksonFactory(), mSettings.getGPID(),
                                mSettings.getGPSecret(), code, mSettings
                                        .getGPRedirectURI()).execute();

                        mSettings.setGPToken(token);

                        // Loading user data
                        retrieveProfile();
                        if (mProfile == null) {retrieveProfile();}
                        res_intent.putExtra(EXTRA_FIRSTNAME, mProfile
                                .getName().getGivenName());
                        res_intent.putExtra(EXTRA_LASTNAME, mProfile
                                .getName().getFamilyName());
                        res_intent.putExtra(EXTRA_NICKNAME,
                                mProfile.getNickname());
                        res_intent.putExtra(EXTRA_SEX, mProfile.getGender());
                        res_intent.putExtra(EXTRA_AVATAR, mProfile
                                .getImage().getUrl());
                        res_intent.putExtra(EXTRA_ID_SOCNET, mProfile.getId());
                        setResult(Activity.RESULT_OK, res_intent);
                        view.setVisibility(View.INVISIBLE);
                        finish();
                    } else if (url.indexOf("error=") != -1) {
                        view.setVisibility(View.INVISIBLE);
                        setResult(Activity.RESULT_CANCELED);
                        finish();
                    }

                } catch (IOException e) {
                    Log.d(LOG_TAG, e.toString());
                }
                return true;
            } else {
                return false;
            }
        }

    });
    webView.loadUrl(googleAuthorizationRequestUrl);
}

/**
 * Retrieve user profile
 */
private void retrieveProfile() throws IOException {
    JsonFactory jsonFactory = new JacksonFactory();
    HttpTransport transport = new NetHttpTransport();

    AccessTokenResponse token = mSettings.getGPToken();

    GoogleAccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource(
            token.accessToken, transport, jsonFactory,
            mSettings.getGPID(), mSettings.getGPSecret(),
            token.refreshToken);

    Builder b = Plus.builder(transport, jsonFactory)
            .setApplicationName("MyApp/1.0");
    b.setHttpRequestInitializer(accessProtectedResource);
    Plus plus = b.build();
    mProfile = plus.people().get("me").execute();
}

}

我在 Google 网站 Stack Overflow 上搜索过,但一无所获。请帮忙。

4

1 回答 1

0

不知道这会有所帮助,但是,如果你绝望....

2012 年 4 月 4 日一些 Android 客户端库的新版本在这里

并且有新的 Google+ 示例,在 main() 方法中使用了一些重新配置的类,它们可以访问受保护的资源。R 1.8 中的新版本与您的代码不同,至少在堆栈的顶部.... IMO 在 Credential 类和 PLUS.Builder 的新示例中的使用可能归结为几乎您已经拥有的相同实现。如果您无法进行其他任何工作,您可能需要查看较新的示例。

1.8 中来自 googlePlus 示例的新代码

  public static void main(String[] args) {
    try {
      try {
        // authorization
        Credential credential = OAuth2Native.authorize(
            HTTP_TRANSPORT, JSON_FACTORY, new LocalServerReceiver(),
            Arrays.asList(PlusScopes.PLUS_ME));
        // set up global Plus instance
        plus = Plus.builder(HTTP_TRANSPORT, JSON_FACTORY)
            .setApplicationName("Google-PlusSample/1.0").setHttpRequestInitializer(credential)
            .build();

旧代码在这里

于 2012-04-20T14:27:36.877 回答