🎨

【Unity】アプリから他のアプリを引数付きで起動する【Android】

2023/06/25に公開

TL;DR

  • 下記の記事を執筆後、引数付きで起動したいなと思ったので試してみました
  • 【Unity】アプリから他のアプリを起動する【Android】
  • 動作確認環境は、諸事情によりAVD(Pixel 4 XL)で確認しました。
  • ProjectSettingsの設定については記載を省略します。前回の記事を参照してください。

手順

  • 前回作成したC#プログラムに関数を追加
  • 引数を受け取る側のC#プログラムを作成
  • ビルド&インストールし動作確認

前回作成したC#プログラムに関数を追加

  • アプリ起動時に引数を与える関数を追加します。
    ①. 定数値を定義します。現実的に実装するなら、定数用の静的なクラスや列挙型を作成したほうが良い気がいます。
    ②. 引数を追加しています。いろんな引数を与えるパターンに対応するなら、関数をオーバーロードして実装する必要がありそうです。
    ③. IntentクラスのputExtra関数を呼び出しています。呼び出し元は引数の型に関係なく、この関数にキーと値のペアを与えることで、呼び出し先に値を渡すことができます。
  • 呼び出し時のMonoBehaviourクラスも、下記のプログラムの変更に応じて呼び出し時の引数を変更します。
  • OnClickではInspectorからは、通常1つの引数しか与えられないので、別途InputFieldや適当な変数を与えるといいと思います。
RunOtherApp.cs
using UnityEngine;
[System.Serializable]
public class RunOtherApp
{
    [SerializeField] private string companyName = "com.Sunmax.";
+   [SerializeField] const string EXTRA_KEY = "TEST"; //①
    const string ACTIVITY = "com.unity3d.player.UnityPlayerActivity";

-   public void LaunchApplicatiion(string productName)
+   public void LaunchApplicatiion(string productName, string value) //②
    {
        var packageName = companyName + productName;

        using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            using (AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
            {
                AndroidJavaObject Intent = new AndroidJavaObject("android.content.Intent");
                Intent.Call<AndroidJavaObject>("setAction", "android.intent.action.VIEW");
                Intent.Call<AndroidJavaObject>("setClassName", packageName, ACTIVITY);
+               Intent.Call<AndroidJavaObject>("putExtra", EXTRA_KEY, value); //③

                activity.Call("startActivity", Intent);
            }
        }
    }
}

引数を受け取る側のC#プログラムを作成

  • 下記のプログラムを作成し、呼び出し先のアプリ(シーン)の適当なGameObjectにアタッチしておきます。
  • 呼び出し先では、引数を受け取る場合は引数の型に応じた、Intentクラスの「get~Extra」を呼び出す必要があります。
  • 関数は、後述するIntentクラスのページを参考にしてください。
  • 下記のプログラムの例では、KEYを"TEST"とした、string型の引数を受け取っています。
ReceiverValue.cs
using UnityEngine;
using UnityEngine.UI;
public class ReceiverValue : MonoBehaviour
{
    [SerializeField] private Text text;
    [SerializeField] const string EXTRA_KEY = "TEST";
    void Start()
    {
        text.text = GetTextValue(EXTRA_KEY);
    }
    private string GetTextValue(string extraKey)
    {
        using (var player = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        using (var activity = player.GetStatic<AndroidJavaObject>("currentActivity"))
        using (var intent = activity.Call<AndroidJavaObject>("getIntent"))
        {
            return intent.Call<string>("getStringExtra", extraKey); //ここが大事
        }
    }
}

ビルド&インストールし動作確認

こんな感じ

https://youtu.be/e0UU23mrBXQ

感想

前回の記事と合わせて活用すると、Intuneみたいな社内向けアプリの容量制限をごにょごにょできてうれしい!

参考文献

Discussion