🅿️
【Unity】アプリから他のアプリを起動する【Android】
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を呼び出し先のアプリと同じものにしてしまうと、アプリが上書きされてしまうので必ず変更してください。
動作確認
こんな感じ
感想
ランチャーアプリ的なものを作れるようになるのでうれしい!
起動時に引数を与える方法も知りたい!
参考文献
- Unity-Androidアプリから明示的インテントで他のアプリを起動する(著者:@koukiwf 投稿日:2018年06月20日)
https://qiita.com/koukiwf/items/564f3db417d27054e2aa - インテントとインテントフィルタ(developer.android.com 更新日:2021年10月27日)
https://developer.android.com/guide/components/intents-filters?hl=ja - Intent(developer.android.com 更新日:2023年6月7日)
https://developer.android.com/reference/android/content/Intent#setClassName(java.lang.String, java.lang.String)
Discussion