AndroidからGoogleドライブへのファイルコピー方法について調べたのですが、見つかるコードサンプルは非推奨(deprecated)になっていたものが多かったので、改めて調べてみました。
公式のGoogleドライブAPIのサンプルプログラムが見つかりました。
https://developers.google.com/drive/android/examples/
demosプロジェクトのBaseDemoActivity.java がそのまま使えそうです。
ただ、このサンプルの中にAndroidのファイルをGoogleドライブにコピーするというサンプルコードが存在せず、APIを調べても見つかりませんでした。(ここまでAPIが充実してるので、fileCopy() 的な一命令でコピーしてくれる便利なAPIがあると思ったのですが…)
そこで、サンプルコードを参考し、ファイルストリームを使用してファイルをコピーするコードを作成しました。
BaseDemoActivity から派生した Activity での処理です。
final Task<DriveFolder> appFolderTask = getDriveResourceClient().getAppFolder();
final Task<DriveContents> createContentsTask = getDriveResourceClient().createContents();
final File file = new File( /* Android内のファイルパス */ );
Tasks.whenAll(appFolderTask, createContentsTask)
.continueWithTask(task -> {
DriveFolder appFolder = appFolderTask.getResult();
DriveContents contents = createContentsTask.getResult();
OutputStream outputStream = contents.getOutputStream();
FileInputStream fileInputStream = new FileInputStream(file.getPath());
byte[] buffer = new byte[fileInputStream.available()];
int data;
while ((data = fileInputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, data);
}
MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
.setTitle(file.getName())
.setMimeType("text/plain") // プレーンテキストファイル
.build();
return getDriveResourceClient().createFile(appFolder, changeSet, contents);
})
.addOnSuccessListener(this,
driveFile -> {
// 成功時の処理
})
.addOnFailureListener(this, e -> {
// 失敗時の処理
})
.addOnCompleteListener(this, result -> {
// (必要なら)完了時の処理
});
1行目 getAppFolder() は、Androidアプリ専用のフォルダーでAndroidアプリからしか見えないので、動作確認時は getRootFolder() にしておいたほうが良いです。
また、Googleドライブは、Androidから同名のファイルをコピー(作成)しても上書きしてくれず、同名のファイルが何個もできるので、削除するコードも必要となってきます。