一、新建一个Android Studio项目工程,设置最低的minimum SDK的为API 16:Android 4.1(Jelly Bean)
二、然后通过File->New->New Module,新建一个模块,选择Android Library,Package name如果需要继承UnityPlayerActivity则需要和项目的包名一致,如果只是使用classes.jar里面的一些方法,则自己选择一个符合的包名字,minimum SDK同样选择16。
三、导入Unity的包,在Unity的安装目录中搜索classes.jar,找到它然后拖入到Project视图-》模块名字-》libs里面,然后右键classes.jar-》Add As Library..
四、在模块-》src->main->包,右键新建一个Java Class,取一个名字就是类名
package com.cdx.unity3d; import android.content.Context; import android.app.Activity; import android.util.Log; import com.unity3d.player.UnityPlayer; public class Utils { /** * android utils log tag */ private static final String TAG = "Utils"; /** * android utils log message */ public static void Log(String message) { Log.e(TAG, message); } /** * U3d程序上下文 */ private Context mContext; /** * U3d接收消息对象名称 */ private String mUnityObjName; /** * 与Unity3d传递消息 */ private void CallUnityMethod(String methodName, String message) { UnityPlayer.UnitySendMessage(mUnityObjName, methodName, message); } /** * 初始化工具 */ public void Initialize(Object context, String objName) { mContext = (Context) context; mUnityObjName = objName; Utils.Log("Utils Initialize Success"); } /** * 上下文名称 */ public String GetContextName() { String name = mContext.toString(); return name; } /** * 获取Url Scheme参数 */ public String GetSchemePars() { String data = SchemeUtil.GetSchemePars((Activity)mContext); return data; } }
package com.cdx.unity3d; import android.app.Activity; import android.net.Uri; public class SchemeUtil { public static String GetSchemePars(Activity activity) { String Param1 = ""; String Param2 = ""; String Param3 = ""; String Param4 = ""; String Param5 = ""; String Param6 = ""; Uri mLink = activity.getIntent().getData(); if(mLink != null) { Param1 = mLink.getQueryParameter("Param1"); Param2 = mLink.getQueryParameter("Param2"); Param3 = mLink.getQueryParameter("Param3"); Param4 = mLink.getQueryParameter("Param4"); Param5 = mLink.getQueryParameter("Param5"); Param6 = mLink.getQueryParameter("Param6"); } String returnName = Param1 + "|" + Param2 + "|" + Param3 + "|" + Param4 + "|" + Param5 + "|" + Param6; activity.getIntent().setData(null);//获取一次后设为空,防止每次都能获取到 return returnName; } }
五、Unity上对应的工具脚本
using UnityEngine; using System.Runtime.InteropServices; namespace com.Bowen.Game.Lobby { public class PluginManager : MonoBehaviour { void Start() { #if UNITY_ANDROID && !UNITY_EDITOR AndroidClassInitialize(); #endif } private AndroidJavaObject mJavaObject { get; set; } //初始化,把Unity附体和Activity(Context)传递给Android写的初始化方法 private void AndroidClassInitialize() { AndroidJavaClass androidClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject androidObj = androidClass.GetStatic<AndroidJavaObject>("currentActivity"); mJavaObject = new AndroidJavaObject("com.cdx.unity3d.Utils");//包名+类名 工具类 mJavaObject.Call("Initialize", androidObj, gameObject.name);//传参,保存应用,可以让Android那边通知Unity这边,也可以让那边访问上下文 } #if UNITY_IOS && !UNITY_EDITOR [DllImport("__Internal")] public static extern string _GetURLString(); #endif public string GetSchemePars() { string data = ""; #if UNITY_ANDROID && !UNITY_EDITOR data = mJavaObject.Call<string>("GetSchemePars"); #elif UNITY_IOS && !UNITY_EDITOR data = _GetURLString(); #endif return data; } } }
六、在Android Studio导出jar包,在Project中选择指定模块然后Build-》Make Module ‘模块名’,随后就可以在Project下你的模块下build有个outputs/arr,把里面的arr文件弄出来,把后缀改成zip,打开把里面的classes.jar拉出来,这个就是jar包了,改个名字,拉进Unity的Plugins/Android下,因为我这里写的只是工具类,所以AndroidManifest.xml不需要导入。
七、修改项目存在的AndroidManifest.xml,如果没有,那就把上面那个包的也拉进项目中。在主activity结点下加上
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="axb" android:host="love.app" android:pathPrefix="/openwith"/> </intent-filter>
八、打开的url就为 axb://love.app/openwith?Param1=1&Param2=2