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から同名のファイルをコピー(作成)しても上書きしてくれず、同名のファイルが何個もできるので、削除するコードも必要となってきます。