android - Android App中使用Google Gdata Spreadsheet 3.0 API的Google账号认证

标签 android authentication spreadsheet

我正在开发一个 Android 应用程序,它与我个人帐户中的 Google 电子表格进行通信。 使用 Android Google API 级别 10 和以下库:

android-support-v4.jar;
gdata-client-1.0.jar;
gdata-client-meta-1.0.jar;
gdata-core-1.0.jar;
gdata-spreadsheet-3.0.jar;
gdata-spreadsheet-meta-3.0.jar;
google-api-client-1.12.0-beta.jar;
google-api-client-android-1.12.0-beta.jar;
google-http-client-1.12.0-beta.jar;
google-http-client-android-1.12.0-beta.jar;
google-oauth-client-1.12.0-beta.jar;
gson-2.1.jar;
guava-13.0.1.jar;
jackson-core-asl-1.9.9.jar;
jsr305-1.3.9.jar;
protobuf-java-2.4.1.jar.

要向/从 Google 电子表格发送/接收数据(使用 Google Gdata Spreadsheet 3.0 API),我需要一个在身份验证阶段使用以下代码返回的对象 SpreadsheetService:

/**
* Authentication to the account  
* @return
* @throws AuthenticationException
*/
public static SpreadsheetService authenticate(final String username, final String password) throws AuthenticationException {
    SpreadsheetService service = new SpreadsheetService("v1");
    service.setProtocolVersion(SpreadsheetService.Versions.V3);
    service.setUserCredentials(email, password);
    return service;
}

但是,此过程需要用户名和密码。 我需要在不显式传递用户名和密码的情况下进行 Google 身份验证。

Android 环境提供了一个帐户对象,从存储在设备上的帐户数据中提取。

如何使用 Account 对象进行身份验证并获取 SpreadsheetService 对象? 非常感谢。

最佳答案

您好,我知道我来不及回答这个问题,但我相信其他人会从中得到帮助,您可以执行以下操作:

    private void chooseAccount() {
            Intent intent = AccountManager.newChooseAccountIntent(null, null,
                    new String[] { "com.google" }, false, null, null, null, null);
            startActivityForResult(intent, ACCOUNT_CODE);
        }

        String accessToken= "";
        String accountName = "";
                @Override
                    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
               if (resultCode == RESULT_OK) {
                        if (requestCode == AUTHORIZATION_CODE) {
                            requestToken();
                        } else if (requestCode == ACCOUNT_CODE) {
                            accountName = data
                                    .getStringExtra(AccountManager.KEY_ACCOUNT_NAME);

                            // invalidate old tokens which might be cached. we want a fresh
                            // one, which is guaranteed to work. Invalidate token based on your needs and the way your code is arranged.
                            invalidateToken();

                            requestToken();
                        }
                    }
                    }

        private void invalidateToken() {
                AccountManager accountManager = AccountManager.get(this);
    if(accessToken!= null && !accessToken.equals(""){
    accountManager.invalidateAuthToken("com.google",
                        accessToken);
    }

            }

        private void requestToken() {
String SCOPE1 = "https://spreadsheets.google.com/feeds";
String SCOPE2 = "https://docs.google.com/feeds";
                Account userAccount = null;

                for (Account account : accountManager.getAccountsByType("com.google")) {
                    if (account.name.equals(accountName)) {
                        userAccount = account;

                        break;
                    }
                }

                accountManager.getAuthToken(userAccount, "oauth2:" + SCOPE1 + " " + SCOPE2, null, this,
                        new OnTokenAcquired(), null);
            }
                private class OnTokenAcquired implements AccountManagerCallback<Bundle> {

                    @Override
                    public void run(AccountManagerFuture<Bundle> result) {
                        try {
                            Bundle bundle = result.getResult();

                            Intent launch = (Intent) bundle.get(AccountManager.KEY_INTENT);
                            if (launch != null) {
                                startActivityForResult(launch, AUTHORIZATION_CODE);
                            } else {
                                accessToken= bundle
                                        .getString(AccountManager.KEY_AUTHTOKEN);
                            }
                        } catch (Exception e) {
                            throw new RuntimeException(e);
                        }
                    }
                }

private void getSpreadSheetServiceInstance(){
 spreadsheetService = new SpreadsheetService(applicationName);
         spreadsheetService.setProtocolVersion(SpreadsheetService.Versions.V3);
spreadsheetService.setAuthSubToken(accessToken);
}  

获取此实例后,按照此处的代码 fragment 操作:Google SpreadSheets Api .不要忘记在 Google Developer 的控制台注册项目并启用 Drive 和 Google Plus Api,生成客户端和 Api key ,设置同意屏幕。

对于 android studio,可以通过 dependencies 部分下的 build.gradle 添加以下库:

compile 'com.google.gdata:core:1.47.1'    
compile 'com.google.android.gms:play-services-drive:7.5.0'
compile 'com.google.android.gms:play-services-plus:7.5.0' 

最后是非常重要的 AndroidManifest 文件:

    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
        <!-- To retrieve the account name (email) as part of sign-in: -->
        <uses-permission android:name="android.permission.GET_ACCOUNTS" />
        <!-- To access Google+ Apis -->
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
        <!-- To retrieve OAuth 2.0 tokens or invalidate tokens to disconnect a user. -->
        <uses-permission android:name="android.permission.USE_CREDENTIALS" />
        <!-- To read Google play services -->
        <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

<meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

关于android - Android App中使用Google Gdata Spreadsheet 3.0 API的Google账号认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13971060/

相关文章:

java - 如何访问 getFilesDir() 作为环境变量?

android - 使用 Firebase Auth 创建用户后 displayName 显示为 null

Android本地化问题: Not all items in the layout update properly when switching locales

flash - 使用 Flash 进行基本身份验证

excel - CSV的最佳时间跨度(时差)格式

google-apps-script - 将addRows()中的电子表格数据作为数组传递

Android:与服务器通信的最佳方式

c# - 需要登录才能观看视频 asp.net

javascript - 基本的 Node.js 快速身份验证不起作用

javascript - Google电子表格自定义函数不返回任何内容