🅿️

【Unity】アプリから他のアプリを起動する【Android】

2023/06/24に公開

TL;DR

  • 環境
    • 対象プラットフォーム:Android
    • 開発エンジン:Unity 2022.3.2f1
    • 動作確認環境:Android13(Xperia 1iii)
  • 内容
    • UnityでビルドしたAndroidアプリを、同端末のAndroidアプリから起動する方法を紹介します
    • 後述する参考文献には、AndroidJavaObject(Intent)に与える引数のMainActivityの値の解説が不足しているので、それを補った記事となります。
    • 環境構築や、Unityプロジェクトの作成、UIの作成、ボタンで関数を呼び出すなどの初歩的な手順は触れません

手順

AndroidManifest.xmlを作成

  • メニューバーのEdit > Project Settings > PlayerからAndroid Settingsを表示し、Publishing Settings内のBuildの項目のうち、Custom Main Manifestにチェックを入れます。

  • チェックを入れると、Assets/Plugins/Android以下にAndroidManifest.xmlが生成されます。

  • 生成されたAndroidManifest.xmlの一例(UnityEditorのバージョンなどで変わるかもしれません)
  • 下記のファイルのうち、7行目の「com.unity3d.player.UnityPlayerActivity」の文字列を後ほど紹介するプログラムで使用します。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
    xmlns:tools="http://schemas.android.com/tools">
    <application>
        <activity android:name="com.unity3d.player.UnityPlayerActivity"
                  android:theme="@style/UnityThemeSelector" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>
</manifest>

呼び出し先のアプリをビルド&インストール

  • メニューバーのEdit > Project Settings > PlayerからAndroid Settingsを表示し、CompanyNameとProductNameを任意の値に設定します。
  • 下記の画像では、CompanyNameに「Sunmax」、ProductNameに「Called」を設定しています。
  • 設定したらビルド&インストールをしておきます。

C#プログラムを作成

  • 2つのプログラムを作成します。
  • RunOtherApp.csのcompanyNameにはProjectSettingsで設定した、任意の文字列を設定します(Sunmaxであれば、"com.Sunmax."を設定します)
  • SerializeField属性を付与しているので、Inspector上で設定できます。
  • 1つ目のプログラムの7行目の定数は、AndroidManifest.xmlで確認した文字列で初期化します。
RunOtherApp.cs
using UnityEngine;

[System.Serializable]
public class RunOtherApp
{
    [SerializeField] private string companyName = "com.Sunmax.";
    const string ACTIVITY = "com.unity3d.player.UnityPlayerActivity";

    public void LaunchApplicatiion(string productName)
    {
        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);

                activity.Call("startActivity", Intent);
            }
        }
    }
}
  • 下記のMonoBehaviourクラスを、シーン上の適当なGameObjectにアタッチします。
NewBehaviourScript.cs
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
    [SerializeField] RunOtherApp runOtherApp;

    public void OnClickLaunchOtherApplication(string productName)
    {
        runOtherApp.LaunchApplicatiion(productName);
    }
}

関数を呼び出し

  • シーン上にボタンを配置し、OnClickに先程アタッチしたMonoBehaviourクラスのOnClickLaunchOtherApplication関数を設定します。
  • 関数の引数には、ProjectSettingsで設定したProductNameの値を設定します。

呼び出し元のアプリをビルド&インストール

  • ProductNameを適当な値(画像中ではCallingに設定)に変更してビルド&インストールします。
  • ProductNameを呼び出し先のアプリと同じものにしてしまうと、アプリが上書きされてしまうので必ず変更してください。

動作確認

こんな感じ

https://www.youtube.com/embed/Ys-H9wStIk0

感想

ランチャーアプリ的なものを作れるようになるのでうれしい!
起動時に引数を与える方法も知りたい!

参考文献

Discussion