Unity×AndroidでGoogle Drive連携する方法

API

UnityアプリからGoogle Driveと連携してログファイルをエクスポート・インポートする機能を実装しました。この記事では、Android実機でのみ可能な連携方法について、実装例とともに紹介します。

「MinuteMind」では、ポモドーロの実行ログをJSONファイルとして保存し、Google Driveにアップロードして他の端末へ引き継ぐことを想定しています。


やりたいこと

  • Unityアプリで生成したログファイル(JSON)をGoogle Driveにアップロードしたい
  • Google Driveからログファイルをインポートして、アプリ内に再反映させたい

必要な準備

  1. FileProviderの設定
    • AndroidManifest.xmlに <provider> タグ追加
    • file_paths.xml でファイルパスの指定
  2. AARライブラリにアップロード処理を追加
    • UnityからJavaコードを呼び出す形でGoogle Drive連携を行います

AARって何?は以下の記事でかるーくですが紹介しております


エクスポート処理:Google Driveにアップロード

主な流れ

  • Application.persistentDataPath にある pomodoro_logs.jsonexported_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.jsonpomodoro_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ベースの実装など)にも取り組んでいく予定です!

コメント

タイトルとURLをコピーしました