Uso de Google para acceder a las hojas de cálculo de Google (u otras aplicaciones de Google) en Android

Estoy desarrollando una aplicación para Android y añadí una característica de inicio de sesión de Google siguiendo el tutorial aquí: https://developers.google.com/identity/sign-in/android/sign-in

Ahora que el usuario está conectado, quiero poder leer y escribir en sus Hojas de cálculo de Google. He examinado la API de hojas de cálculo y le digo que utilice OAuth para autorizar solicitudes: https://developers.google.com/google-apps/spreadsheets/?hl=es

Desde el tutorial de inicio de sesión:

El botón de inicio de sesión de Google autentica al usuario y administra el flujo de OAuth 2.0, que simplifica la integración con las API de Google.

Estoy intentando usar la página de inicio de sesión de Google para el proceso de autorización. Puedo ingresar y salir con éxito de mi cuenta de Google ahora usando GoogleApiClient, así que intenté agregar el código siguiente para tener acceso a mis hojas de balance que llamo cuando el usuario está entrado:

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; } } 

Lo llamo usando esta línea:

 new RetrieveFeedTask().execute("https://spreadsheets.google.com/feeds/spreadsheets/private/full"); 

Pero en la llamada service.getFeed estoy recibiendo el siguiente error:

 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) 

Las soluciones que encontré mirando las preguntas pasadas no funcionaron. Uno de ellos era hacer service.setUserCredentials (usuario, contraseña) antes de la llamada, pero no sé cómo obtener esa información como yo personalmente no implementar la parte OAuth.

¿Cómo puedo resolver este error y utilizar la página de inicio de sesión de Google como mi autenticación?


En primer lugar, sugeriría establecer el encabezado de autorización que contiene el token de acceso.

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

Además, tenga en cuenta que si desea crear nuevas hojas necesitará más ámbitos añadidos:

Además, si una aplicación necesita crear hojas de cálculo o manipular sus metadatos, la aplicación también debe solicitar un ámbito de API de Google Drive; Vea Elegir ámbitos de autenticación en los documentos de la API de Google Drive para obtener información sobre los ámbitos disponibles.

Otra cosa a intentar es utilizar el método setOAuth2Credentials, como se describe a continuación, descaradamente robado de Crear hoja de cálculo utilizando la API de hoja de cálculo de Google en la unidad de Google en 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); 

Con respecto al archivo de clave P12, consulte https://webapps.stackexchange.com/questions/58411/how-where-to-obtain-a-p12-key-file-from-the-google-developers-console

Otras referencias: 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 / Alcance

  • Cómo configurar Appium en Mac OS para ejecutar pruebas automatizadas de clases JAVA en dispositivos Android e iOS
  • Cómo actualizar un TextView de una actividad de otra clase
  • Utilizar mi propia aplicación Android / apk como lanzador / reemplazo de pantalla de inicio
  • Parse.com - Enviar duplicado después de reinstalar la aplicación
  • Proteger la aplicación de la descompilación ocultando Manifest y convirtiendo el código en un carácter Unicode
  • Uso de la gramática JSGF en lugar del modelo de lenguaje DMP (use -jsgf en lugar de -lm) en CMU Sphinx (pocketsphinx)
  • ¿Alternativa a dex2jar y jd-GUI?
  • Cómo y qué establecer en Android WifiConfiguration.preSharedKey para conectarse a la red WPA2 PSK WiFi
  • AndEngine - eliminar un Sprite particular y su cuerpo
  • Android: ¿Los elementos de las listas no se vuelven naranjas cuando se hace clic?
  • Cómo publicar HTTPS en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.