使用Google登录访问Android上的Google电子表格(或其他Google应用)

Zar*_*wan 5 java android google-api google-sheets google-api-client

我正在开发一个Android应用,并按照以下教程添加了Google登录功能:https://developers.google.com/identity/sign-in/android/sign-in

现在用户已登录,我希望能够读取和写入他们的Google Spreadsheets.我查看了电子表格API并告诉您使用OAuth授权请求:https://developers.google.com/google-apps/spreadsheets/?hl = zh- CN

从登录页面教程:

Google登录按钮可对用户进行身份验证并管理OAuth 2.0流程,从而简化您与Google API的集成.

我正在尝试使用Google登录页面进行授权.我现在可以使用GoogleApiClient成功登录和退出我的Google帐户,因此我尝试添加以下代码来访问我在用户登录时调用的电子表格:

private class RetrieveFeedTask extends AsyncTask<String, Void, Void> {

        @Override
        protected Void doInBackground(String... urls) {
            SpreadsheetService service = new SpreadsheetService("MySpreadsheetIntegration-v1");

            try {
                URL SPREADSHEET_FEED_URL = new URL(urls[0]);
                SpreadsheetFeed feed = service.getFeed(SPREADSHEET_FEED_URL, SpreadsheetFeed.class);
                List<SpreadsheetEntry> spreadsheets = feed.getEntries();

                for (SpreadsheetEntry spreadsheet : spreadsheets) {
                    System.out.println(spreadsheet.getTitle().getPlainText());
                }

            } catch (ServiceException | IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我用这行称呼它:

new RetrieveFeedTask().execute("https://spreadsheets.google.com/feeds/spreadsheets/private/full");
Run Code Online (Sandbox Code Playgroud)

但是在service.getFeed调用上我收到以下错误:

com.google.gdata.util.ParseException: Unrecognized content type:application/binary
    at com.google.gdata.client.Service.parseResponseData(Service.java:2136)
    at com.google.gdata.client.Service.parseResponseData(Service.java:2098)
    at com.google.gdata.client.Service.getFeed(Service.java:1136)
    at com.google.gdata.client.Service.getFeed(Service.java:998)
    at com.google.gdata.client.GoogleService.getFeed(GoogleService.java:645)
    at com.google.gdata.client.Service.getFeed(Service.java:1017)
    at com.zarwanhashem.ideatrackr.MainActivity$RetrieveFeedTask.doInBackground(MainActivity.java:320)
    at com.zarwanhashem.ideatrackr.MainActivity$RetrieveFeedTask.doInBackground(MainActivity.java:312)
    at android.os.AsyncTask$2.call(AsyncTask.java:292)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    at java.lang.Thread.run(Thread.java:818)
Run Code Online (Sandbox Code Playgroud)

我通过查看过去的问题找到的解决方案不起作用.其中一个是在调用之前做service.setUserCredentials(用户,密码),但我不知道如何获取该信息,因为我没有亲自实现OAuth部分.

如何解决此错误并使用google登录页面作为我的身份验证?


Ali*_*chi 2

首先,我建议设置包含访问令牌的授权标头。

String accountname = Plus.AccountApi.getAccountName(mGoogleApiClient);
String scope = "oauth2:" + Scopes.PLUS_LOGIN + " " + "https://spreadsheets.google.com/feeds"; // add more scopes here
String accessToken = GoogleAuthUtil.getToken(context, accountname, scope);
service.setHeader("Authorization", "Bearer " + accessToken);
Run Code Online (Sandbox Code Playgroud)

另请注意,如果您想创建新工作表,则需要添加更多范围:

此外,如果应用程序需要创建电子表格或以其他方式操作其元数据,则该应用程序还必须请求 Google Drive API 范围;有关可用范围的信息,请参阅 Google Drive API 文档中的选择身份验证范围。

另一件要尝试的事情是使用 setOAuth2Credentials 方法,如下所述,无耻地从Create Spreadsheet using Google Spreadsheet API in Google Drive in Java 中窃取。

   HttpTransport httpTransport = new NetHttpTransport();
   JacksonFactory jsonFactory = new JacksonFactory();
   String [] scopesArray= {"https://spreadsheets.google.com/feeds", "https://docs.google.com/feeds"}; // add more scopes here
   final List SCOPES = Arrays.asList(scopesArray);
   GoogleCredential credential = new GoogleCredential.Builder()
     .setTransport(httpTransport)
     .setJsonFactory(jsonFactory)
     .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
     .setServiceAccountScopes(SCOPES)
     .setServiceAccountPrivateKeyFromP12File(SERVICE_ACCOUNT_PKCS12_FILE)
     .build();

   SpreadsheetService service = new SpreadsheetService("MySpreadsheetIntegration-v1");
   service.setOAuth2Credentials(credential);
Run Code Online (Sandbox Code Playgroud)

关于P12密钥文件,请参阅https://webapps.stackexchange.com/questions/58411/how-where-to-obtain-a-p12-key-file-from-the-google-developers-console

其他参考: https://developers.google.com/google-apps/spreadsheets/authorize https://developers.google.com/drive/web/scopes https://developers.google.com/android/reference/com /google/android/gms/common/api/范围