Android通过Scheme Url唤醒并传参

一、新建一个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


首页 我的博客
粤ICP备17103704号