簡體   English   中英

如何在Android應用上使用Google+帳戶提供多用戶訪問權限

[英]How can I provide multiple-user access using Google+ accounts on the Android app

我正在開發一個多用戶Android應用程序,該應用程序向其用戶提供對GMaps(彼此查找),聊天等的訪問權限。 用戶應使用其在Twitter,Facebook,Google +等上的帳戶登錄到應用程序。除G +之外,所有其他帳戶都可以正常使用-應用程序只能使用其所有者帳戶才能訪問G + API。 使用其他帳戶,我會收到com.google.api.client.googleapis.json.GoogleJsonResponseException:找不到404或“授權錯誤”。 應用已在API控制台上注冊,並使用了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,但一無所獲。 請幫忙。

不知道這會有所幫助,但是,如果您不顧一切的話...

2012年4月4日在這里新發布了一些Android客戶端庫

還有一個新的Google+示例,它在main()方法中使用一些重新配置的類來訪問受保護的資源。 R 1.8中的新版本與您的代碼不同,至少在堆棧的頂部。...IMO在Credential類和PLUS.Builder的新示例中的用法可能會歸結為您已經擁有的相同實現。 如果您無法使其他任何功能正常工作,則可能需要查看較新的示例。

GooglePlus示例1.8中的新代碼

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

這里的舊代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM