¿Cómo descargar el archivo de Google Drive con Drive.API?

Estoy utilizando Google Drive.Api para obtener datos de la aplicación del usuario sincronizados con la cuenta de unidad de los usuarios.

La base de datos de usuario está en formato de base de datos sqlite. He subido con éxito el archivo en binario a la impulsión pero no poder descargar el archivo de dentro de la aplicación.

Cómo obtengo el archivo URl:

final GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(this, Arrays.asList(DriveScopes.DRIVE_FILE)); credential.setSelectedAccountName(accountName); service = new com.google.api.services.drive.Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential).build(); Query query = new Query.Builder() .addFilter(Filters.eq(SearchableField.TITLE, "BackupFile")) .build(); final DriveFolder folder = Drive.DriveApi.getRootFolder(mGoogleApiClient); folder.queryChildren(mGoogleApiClient, query).setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() { @Override public void onResult(DriveApi.MetadataBufferResult metadataBufferResult) { final MetadataBuffer metadataBuffer = metadataBufferResult.getMetadataBuffer(); int iCount = metadataBuffer.getCount(); if (iCount == 1) { Log.i("Tag", "file was found"); final DriveId myFileId = metadataBuffer.get(0).getDriveId(); final DriveFile file = Drive.DriveApi.getFile(mGoogleApiClient, myFileId); new Thread(new Runnable() { @Override public void run() { DriveResource.MetadataResult mdRslt = file.getMetadata(mGoogleApiClient).await(); if (mdRslt != null && mdRslt.getStatus().isSuccess()) { String link = mdRslt.getMetadata().getWebContentLink(); Log.d("TAG", "Link to File:" + link); DownloadBackup(link); } } }).start(); } metadataBuffer.release(); } }); 

Tratando de descargar el archivo a través de:

 public void DownloadBackup(String url){ InputStream mInput=null; FileOutputStream mOutput=null; if(url != null && url.length() > 0 ){ try { GoogleAccountCredential crd = GoogleAccountCredential.usingOAuth2(this, Arrays.asList(DriveScopes.DRIVE_FILE)); crd.setSelectedAccountName(accountName); com.google.api.services.drive.Drive srv = new com.google.api.services.drive.Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), crd).build(); mInput = srv.getRequestFactory().buildGetRequest(new GenericUrl(url)).execute().getContent(); String outFileName = getApplicationContext().getDatabasePath(DatabaseHandler.DATABASE_NAME).getPath(); mOutput = new FileOutputStream(outFileName); byte[] mBuffer = new byte[1024]; int mLength; while ((mLength = mInput.read(mBuffer)) > 0) { mOutput.write(mBuffer, 0, mLength); } mOutput.flush(); Log.d("TAG", "Successfully Downloaded contents"); } catch (IOException e) { e.printStackTrace(); }finally { try { //Close the streams if(mOutput != null){ mOutput.close(); } if(mInput != null){ mInput.close(); } } catch (IOException e) { Log.e("Tag", "failed to close databases"); } } } else { // The file doesn't have any content stored on Drive. // return null; Log.e("Tag", "No content on Drive"); } } 

Registro de errores:

 W/System.err﹕ com.google.api.client.http.HttpResponseException: 401 Unauthorized W/System.err﹕ <HTML> W/System.err﹕ <HEAD> W/System.err﹕ <TITLE>Unauthorized</TITLE> W/System.err﹕ </HEAD> W/System.err﹕ <BODY BGCOLOR="#FFFFFF" TEXT="#000000"> W/System.err﹕ <H1>Unauthorized</H1> W/System.err﹕ <H2>Error 401</H2> W/System.err﹕ </BODY> W/System.err﹕ </HTML> W/System.err﹕ [ 06-12 11:01:05.447 26208:26236 W/System.err ] at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1061) W/System.err﹕ at com.example.app.activities.Main.DownloadBackup(Main.java:487) W/System.err﹕ at com.example.app.activities.Main$15$1.run(Main.java:332) W/System.err﹕ at java.lang.Thread.run(Thread.java:841) 

Aquí es cómo lo hago con éxito. En lugar de guardar el resultado de 'getWebContentLink', guardo un archivo / carpeta ID (es una cadena). Y pase esta ID a un método como este:

  /************************************************************************* * get file contents * @param resId file driveId * @return file's content / null on fail */ static InputStream read(String resId) { if (mGOOSvc != null && mConnected && resId != null) try { File gFl = mGOOSvc.files().get(resId).setFields("downloadUrl").execute(); if (gFl != null){ String strUrl = gFl.getDownloadUrl(); return mGOOSvc.getRequestFactory() .buildGetRequest(new GenericUrl(strUrl)).execute().getContent(); } } catch (Exception e) { /* error handling */ } return null; } 

Recuperando un "downloadURL" y obtener el contenido. El contexto completo de este método se puede ver aquí .

Buena suerte

  • ¿Cómo eliminar la base de datos del emulador?
  • Intente volver a abrir un objeto ya cerrado: SQLiteDatabase:
  • IOS / Android sincronización con Delphi / C # aplicación de escritorio
  • NoClassDefFoundError al usar greenDao
  • ¿Cuándo debo guardar datos en SQLite ingresados ​​en un fragmento en mi aplicación de Android?
  • Cifrar la base de datos sqlite Android:
  • Android table creation Fallo (cerca de "autoincrement": error de sintaxis)?
  • Active Android es propenso a las inyecciones de SQL. ¿Alguna solución conocida?
  • El uso de selectArgs no funciona en una consulta
  • ¿Cómo puedo insertar una comilla doble (") en el campo Varchar de la base de datos SQLite?
  • ¿Cómo deshabilitar el archivo de diario SQLite de SQL?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.