7

Я использую Google Drive.Api, чтобы синхронизировать данные пользователя с учетной записью пользователя.Как загрузить файл с Google Диска с помощью Drive.API?

База данных пользователей находится в формате базы данных sqlite. Я успешно загрузил файл в двоичном виде на диск, но не смог загрузить файл из приложения.

Как получить файл 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(); 
     } 
    }); 

Попытка загрузить файл с помощью: Вход

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

Ошибка:

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) 
+0

Обратите внимание, что вы смешение Drive Android API (для запроса и получить ссылку) и API Drive REST (для загрузки). Возможно, лучше использовать один и тот же API. Для API Android см. Https://developers.google.com/drive/android/files Для API REST см. Https://developers.google.com/drive/web/quickstart/java – Ofir

ответ

4

Вот как я это сделать успешно. Вместо сохранения результата «getWebContentLink» я сохраняю идентификатор файла/папки (это строка). И передайте этот идентификатор методу, подобному этому:

Извлечение «downloadURL» и получение контента. Полный контекст этого method можно увидеть here.

Good Luck

+0

... и я предположим, что вы можете восстановить/сохранить/использовать строку «downloadUrl», но объект ID (ResourceID) считается основным идентификатором. – seanpj

+0

Файл gFl = mGOOSvc.files(). Get (resId) .setFields ("downloadUrl"). Execute(); Не выполняется. Даже если «условия (mGOOSvc! = Null && mConnected && resId! = Null)» выполнены. – GenerikV

+0

Я понимаю, что «не выполняет», поскольку «не возвращается». Если это так, сервер не отвечает. Вы пытались сформулировать параметры (и проверить его) [здесь (внизу страницы)] (https://developers.google.com/drive/v2/reference/files/get) – seanpj

Смежные вопросы