「westhillapp01://urlschemetest」のような独自のURLを使って、
Unity Androidアプリを起動する方法の実装メモです。
ブラウザや他のアプリからUnity Androidアプリを起動
iOS版はこちら
実装時のバージョンはUnity4.0.1。
実装手段として、Androidのプラグインを作成してプロジェクトに組み込みます。
Unityが使用しているUnityPlayerActivityを継承する方法もあるのですが、
同時に使用しているプラグイン等との衝突を避けるために、
独自のActivityを作成して、カスタムURLスキームからの起動時には
独自のActivityを立ちあげる→UnityPlayerActivityへ遷移という実装にしました。
参考:Building Plugins for Android
(「Extending the UnityPlayerActivity Java Code」以下)
①まずは、独自のActivityを含むjarライブラリを作成します。
eclipseで新規Androidプロジェクトを作って、
右クリック→Properties→AndroidでIsLibraryにチェック。
②Unity Adnroidで使用しているクラスを参照するため、
以下パス内にある classes.jar ファイルを「libs」フォルダ内に配置します。
③独自URL経由で起動するActivityを作成します。
IntentReceiveActivity.java
Unityで使用している開始時のアクティビティUnityPlayerProxyActivityへ遷移するようにしています。
④↑で作成したAndroidプロジェクトをビルドして、「bin/」配下の プロジェクト名.jarファイル を
Unityプロジェクトビューのルート(フォルダ構成で言うとAssets直下)に「Plugins/Android」フォルダを作成して配置します。
⑤「Plugins/Android」フォルダに、 AndroidManifest.xml を作成します。
AndroidManifest.xml
Unity Androidアプリを起動する方法の実装メモです。
ブラウザや他のアプリからUnity Androidアプリを起動
iOS版はこちら
実装時のバージョンはUnity4.0.1。
実装手段として、Androidのプラグインを作成してプロジェクトに組み込みます。
Unityが使用しているUnityPlayerActivityを継承する方法もあるのですが、
同時に使用しているプラグイン等との衝突を避けるために、
独自のActivityを作成して、カスタムURLスキームからの起動時には
独自のActivityを立ちあげる→UnityPlayerActivityへ遷移という実装にしました。
参考:Building Plugins for Android
(「Extending the UnityPlayerActivity Java Code」以下)
①まずは、独自のActivityを含むjarライブラリを作成します。
eclipseで新規Androidプロジェクトを作って、
右クリック→Properties→AndroidでIsLibraryにチェック。
②Unity Adnroidで使用しているクラスを参照するため、
以下パス内にある classes.jar ファイルを「libs」フォルダ内に配置します。
Winの場合:Unityのインストールパス\Editor\Data\PlaybackEngines\androidplayer\bin
Macの場合:Unityのインストールパス/Unity.app/Contents/PlaybackEngines/AndroidPlayer/bin
③独自URL経由で起動するActivityを作成します。
IntentReceiveActivity.java
public class IntentReceiveActivity extends Activity { /* アクティビティ保持用 */ private static Activity mThisActivity; /* アクティビティ遷移ハンドラ */ private static Handler mMoveActivityHandler = new Handler() { @Override public void handleMessage(Message msg) { // UnityPlayerProxyActivityへ遷移 if (mThisActivity != null) { Intent i = new Intent(mThisActivity.getApplication(), UnityPlayerProxyActivity.class); mThisActivity.startActivity(i); mThisActivity.finish(); mThisActivity = null; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Context context = getApplicationContext(); // SharedPreferences取得。UnityのPlayerPrefsでは、 // バンドル名のSharedPreferencesを使用しているので合わせる SharedPreferences packagePrefs = context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE); SharedPreferences.Editor editor = packagePrefs.edit(); // 指定のスキーム経由で起動されたフラグをSharedPreferencesに保存 editor.putInt(getIntent().getData().getScheme(), 1); editor.commit(); // アクティビティを保持 mThisActivity = this; // アクティビティ遷移 mMoveActivityHandler.sendEmptyMessageDelayed(0, 10); } @Override public void onBackPressed() { // バックキーで何もしない // super.onBackPressed(); } }ここでは起動時のURLスキーム名をキーにしてSharedPreferencesにintのフラグを保存し、
Unityで使用している開始時のアクティビティUnityPlayerProxyActivityへ遷移するようにしています。
④↑で作成したAndroidプロジェクトをビルドして、「bin/」配下の プロジェクト名.jarファイル を
Unityプロジェクトビューのルート(フォルダ構成で言うとAssets直下)に「Plugins/Android」フォルダを作成して配置します。
⑤「Plugins/Android」フォルダに、 AndroidManifest.xml を作成します。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="https://schemas.android.com/apk/res/android" package="com.unity3d.player" android:installLocation="preferExternal" android:versionCode="1" android:versionName="1.0"> <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true"/> <application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="true"> <activity android:name="com.unity3d.player.UnityPlayerProxyActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"> </activity> <activity android:name="com.unity3d.player.UnityPlayerNativeActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"> <meta-data android:name="android.app.lib_name" android:value="unity" /> <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" /> </activity> <!-- カスタムURLスキームからの起動用Activity --> <activity android:name="【ライブラリのパッケージ名】.IntentReceiveActivity"> <intent-filter> <data android:scheme="【URLスキーム名】" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <action android:name="android.intent.action.VIEW" /> </intent-filter> </activity> </application> </manifest>
大事なのは<!-- カスタムURLスキームからの起動用Activity -->のIntentReceiveActivity定義部分です。
カスタムURLスキームリンク要求時に、指定のActivityでアプリを立ち上げる設定をしています。
【ライブラリのパッケージ名】の部分に①で作成したライブラリのパッケージ名を入れ、
【URLスキーム名】の部分を使用したい独自スキーム名にします。
※スキーム名は、URLの":"以前の部分になります。↑の例でいうと westhillapp01。
※同時に使用しているプラグイン等でAndroidManifestが既に作られている場合には、
<!-- カスタムURLスキームからの起動用Activity -->部分のみ追記すれば問題ないです。
⑥Unity側で、カスタムURLスキームからの起動か否かを
以下のようにPlayerPrefsを使用して②で保存したフラグから判別することが出来ます。
カスタムURLスキームリンク要求時に、指定のActivityでアプリを立ち上げる設定をしています。
【ライブラリのパッケージ名】の部分に①で作成したライブラリのパッケージ名を入れ、
【URLスキーム名】の部分を使用したい独自スキーム名にします。
※スキーム名は、URLの":"以前の部分になります。↑の例でいうと westhillapp01。
※同時に使用しているプラグイン等でAndroidManifestが既に作られている場合には、
<!-- カスタムURLスキームからの起動用Activity -->部分のみ追記すれば問題ないです。
⑥Unity側で、カスタムURLスキームからの起動か否かを
以下のようにPlayerPrefsを使用して②で保存したフラグから判別することが出来ます。
bool launchFromCustomUrlScheme = PlayerPrefs.GetInt("【URLスキーム名】", 0) == 1 ? true: false; PlayerPrefs.DeleteKey("【URLスキーム名】");