2016-05-15 8 views
0

Мне просто не удается загрузить файл с Google Drive, я только что создал. Я могу получить webContentLink. Если я получаю доступ к этому через браузер, я могу загрузить файл, но я не могу загрузить тот же файл через свое приложение ... Я читаю почти каждую документацию о Google Диске, но я не мог найти способ загрузить файл в мое хранилище.Загрузите файл с Google Drive с помощью google-api-services-drive: v3

Здесь я получаю ссылку на файл ... я могу получить то, что когда-нибудь я хочу, как этот

downloadLink = m.getAlternateLink(); 
downloadLink = m.getEmbedLink(); 
downloadLink = m.getWebContentLink(); 
downloadLink = m.getWebViewLink(); 

или любого другого параметра, как DriveId ...

Вот мой код, чтобы получить это информация для файла на Диске:

Query query2 = new Query.Builder() 
    .addFilter(Filters.and(Filters.eq(
    SearchableField.TITLE, "locations.csv"), 
    Filters.eq(SearchableField.TRASHED, false))) 
           .build(); 
    Drive.DriveApi.query(mGoogleApiClient, query2) 
    .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() { 
    @Override 
    public void onResult(DriveApi.MetadataBufferResult result) { 
     if (!result.getStatus().isSuccess()) { 
     System.out.println("File does not exists"); 
      } else { 
      for(Metadata m : result.getMetadataBuffer()) { 
      if (m.getTitle().equals("locations.csv")) { 
       downloadLink = m.getWebContentLink(); 
       } 
      } 
     } 
     } 
    }); 

В этой папке есть только один файл, я уверен. Так что мне просто нужен способ получить этот файл, загруженный в фоновом режиме на SD-карту или лучшую конкретную папку.

Любая помощь приветствуется! Благодарю.

МОЕ РЕШЕНИЕ

По щелчку где-то в коде

driveFileMy.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, null) 
        .setResultCallback(contentsOpenedCallback); 

тогда я делаю это:

final private ResultCallback<DriveApi.DriveContentsResult> contentsOpenedCallback = 
     new ResultCallback<DriveApi.DriveContentsResult>() { 
      @Override 
      public void onResult(DriveApi.DriveContentsResult result) { 
       if (!result.getStatus().isSuccess()) { 
        // display an error saying file can't be opened 
        return; 
       } 
       // DriveContents object contains pointers 
       // to the actual byte stream 
       DriveContents contents = result.getDriveContents(); 
       InputStream inputStream = contents.getInputStream(); 
       OutputStream out = null; 
       try { 
        out = new FileOutputStream(filelocation); 
        byte[] buffer = new byte[1024]; 
        int read; 
        while ((read = inputStream.read(buffer)) != -1) { 
         out.write(buffer, 0, read); 
        } 

        out.flush(); 
        inputStream.close(); 
        out.close(); 

       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 

Строка filelocation является расположение выходного файла, где он должен быть сохранены. Всем спасибо :)!

+0

Если у вашей downloadLink есть ссылка, которую вы можете использовать для загрузки через браузер, она не только открывает эту ссылку с InputStream и сохраняет содержимое на вашей SD-карте? – jonathanrz

ответ

1

API-интерфейс Drive имеет full guide on working with file contents, то есть получает прямой файл InputStream.

Учитывая в DriveFile, вы открываете его с

DriveFile file = ... 
file.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, null) 
    .setResultCallback(contentsOpenedCallback); 

Использование ResultCallback, который выглядит как:

ResultCallback<DriveContentsResult> contentsOpenedCallback = 
    new ResultCallback<DriveContentsResult>() { 
    @Override 
    public void onResult(DriveContentsResult result) { 
    if (!result.getStatus().isSuccess()) { 
     // display an error saying file can't be opened 
     return; 
    } 
    // DriveContents object contains pointers 
    // to the actual byte stream 
    DriveContents contents = result.getDriveContents(); 
    } 
}; 

Вы можете прочитать из InputStream через contents.getInputStream(), записывая его в локальный файл, если Ты бы хотел.

Имейте в виду, что поскольку Google Drive уже хранит локальную копию, как только вы открыли файл, если вам нужно только содержание в вашем приложении, то лучше использовать InputStream напрямую, а не сохранить его в еще другой локальный файл (удвоение необходимого объема памяти).

+0

мой плохой, как я мог пропустить эту часть ... никогда не работал с InputStream, но я постараюсь понять это. Мне нужна локальная копия в определенной папке, чтобы мое приложение могло получить к ней доступ. Спасибо, я отправлю код, если я его заработаю. – Wladislaw

+0

Ваше приложение уже обращается к байту за байтом, идентичному 'InputStream', но все в порядке. Удачи! – ianhanniballake

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