2016-05-15 17 views
0

Googleドライブからファイルをダウンロードすることはできません。私はwebContentLinkを入手できます。私はこのブラウザにアクセスするとファイルをダウンロードできますが、アプリで同じファイルをダウンロードすることはできません... Googleドライブに関するほとんどすべてのドキュメントを読んでいますが、私のストレージにファイルをダウンロードする方法が見つかりませんでした。google-api-services-driveを使用してGoogleドライブからファイルをダウンロード: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(); 
       } 
      } 
     } 
     } 
    }); 

このフォルダには、ファイルが1つしかありません。だから私は、この1つのファイルをバックグラウンドで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

ダウンロードリンクにブラウザ経由でダウンロードできるリンクがある場合、そのリンクをInputStreamで開き、コンテンツをSDカードに保存するだけでなく、 – jonathanrz

答えて

1

ドライブAPIには、full guide on working with file contentsがあります。つまり、直接ファイルがInputStreamになります。ローカルファイルの場合にそれを書いて、あなたはその後、contents.getInputStream()経由InputStreamから読み取ることができます

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

DriveFileを考えると、あなたは次のようになりますResultCallbackを使用して

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

で開きますあなたが望むでしょう。

は、あなただけのアプリ内でコンテンツが必要な場合は、ファイルを開いた後、Googleドライブ が既にローカルコピーを保持するので、 InputStreamを使用し、直接ではなく、まだそれにを保存するために優れていることに注意してください別のローカルファイル(必要な記憶域を倍増)。

+0

私の悪いですが、どうすればこの部分を逃すことができますか... InputStreamを使ったことはありませんでしたが、私はそれを理解しようとします。私のアプリケーションがアクセスできるように、特定のフォルダにローカルコピーが必要です。ありがとう、私はそれが動作するようになる場合は、コードを投稿します。 – Wladislaw

+0

あなたのアプリは、既にバイトインバイトの同じ 'InputStream'にアクセスしていますが、大丈夫です。運が良かった! – ianhanniballake

関連する問題