UnityアプリからGoogle Driveと連携してログファイルをエクスポート・インポートする機能を実装しました。この記事では、Android実機でのみ可能な連携方法について、実装例とともに紹介します。
「MinuteMind」では、ポモドーロの実行ログをJSONファイルとして保存し、Google Driveにアップロードして他の端末へ引き継ぐことを想定しています。
やりたいこと
- Unityアプリで生成したログファイル(JSON)をGoogle Driveにアップロードしたい
- Google Driveからログファイルをインポートして、アプリ内に再反映させたい
必要な準備
- FileProviderの設定
- AndroidManifest.xmlに
<provider>
タグ追加 file_paths.xml
でファイルパスの指定
- AndroidManifest.xmlに
- AARライブラリにアップロード処理を追加
- UnityからJavaコードを呼び出す形でGoogle Drive連携を行います
AARって何?は以下の記事でかるーくですが紹介しております
エクスポート処理:Google Driveにアップロード
主な流れ
Application.persistentDataPath
にあるpomodoro_logs.json
をexported_pomodoro_logs.json
にコピーIntent
を使ってGoogle Driveアプリに渡す(ACTION_SEND
)
実装例(抜粋)
private void OpenGoogleDriveUpload(string filePath)
{
AndroidJavaObject unityActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer")
.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
AndroidJavaObject intent = new AndroidJavaObject("android.content.Intent");
intent.Call<AndroidJavaObject>("setAction", intentClass.GetStatic<string>("ACTION_SEND"));
intent.Call<AndroidJavaObject>("setType", "application/json");
AndroidJavaObject fileObj = new AndroidJavaObject("java.io.File", filePath);
AndroidJavaObject uri = new AndroidJavaClass("androidx.core.content.FileProvider")
.CallStatic<AndroidJavaObject>("getUriForFile", unityActivity, "com.minutemind.app.provider", fileObj);
intent.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_STREAM"), uri);
intent.Call<AndroidJavaObject>("setPackage", "com.google.android.apps.docs");
intent.Call<AndroidJavaObject>("addFlags", intentClass.GetStatic<int>("FLAG_GRANT_READ_URI_PERMISSION"));
unityActivity.Call("startActivity", intent);
}
補足
FileProvider
経由でURIを発行し、Google Driveアプリのインテントで直接アップロード画面を起動setPackage("com.google.android.apps.docs")
により対象をGoogle Driveに限定
インポート処理:Google Driveからファイル取得
主な流れ
StartImportFromGoogleDrive()
で、AARに含まれるActivity(例:FileImportActivity
)を起動- インポート後、フラグファイル(
import_done.flag
)を使ってUnity側で受け取る exported_pomodoro_logs.json
をpomodoro_logs.json
に上書きして反映
csharpコピーする編集するvoid OnApplicationFocus(bool hasFocus)
{
if (hasFocus)
{
string flagPath = Path.Combine(Application.persistentDataPath, "import_done.flag");
if (File.Exists(flagPath))
{
SaveImportedJson(); // JSON読み取り&上書き
File.Delete(flagPath);
}
}
}
補足
- フォーカス復帰時にインポート完了をチェック
import_done.flag
はAAR側でインポート後に作成される想定
注意点とポイント
項目 | 内容 |
---|---|
対象 | Android実機のみ(Unity Editorでは動作しない) |
セキュリティ | FileProvider の設定必須。URIパーミッションも忘れずに |
Driveアプリ依存 | Google Driveアプリが端末にインストールされている必要あり |
AAR連携 | Unity単体では完結しないため、Java側の処理実装が必要 |
まとめ
UnityでGoogle Driveとの連携を行う場合、AndroidのIntent機能とFileProviderを組み合わせることで、比較的簡単にエクスポート/インポート機能を実現できます。
MinuteMindではこの方法でログのクラウド保存&復元機能を実現し、複数端末間でのデータ引き継ぎに対応しました。
今後も、よりスムーズな連携方法(APIベースの実装など)にも取り組んでいく予定です!
コメント