Unity Android 之 基础 Unity 调用 Android 的原生方法的方式的一些简单整理(仅供参考)

 

 

Unity Android 之 基础 Unity 调用 Android 的原生方法的方式的一些简单整理(仅供参考)

 

目录

Unity Android 之 基础 Unity 调用 Android 的原生方法的方式的一些简单整理(仅供参考)

一、简单介绍

二、Unity Android 相关整理

1、Unity 获取 Android 当前的 currentActivity (或者叫Context上下文)

2、Unity 获取 Android 类、类的方法函数、字段属性等

3、Unity 获取 Android 定义的接口回调,并对应设置的方法

三、Unity 直接调用 Android 原生接口的使用案例

1、Unity 段代码

2、对应同样功能 Android 端代码


 

一、简单介绍

整理一些在Unity上可以方便调用 Android 方法的一些接口脚本,便于后期开发使用。

本节整理一些 Unity 直接调用 Android 类、函数、字段等的一些方法。

根据unity用户手册,unity可以采用native code(c/c++),但是也提供了C#调用方法,本文对此进行简单讲解。

 

二、Unity Android 相关整理

1、Unity 获取 Android 当前的 currentActivity (或者叫Context上下文)

private static string unityPlayerClass = "com.unity3d.player.UnityPlayer";
    public static AndroidJavaObject GetActivity()
    {
        AndroidJavaClass jc = new AndroidJavaClass(unityPlayerClass);
        if (jc == null)
        {
            Debug.LogErrorFormat("Failed to get Unity Player class, {0}", unityPlayerClass);
            return null;
        }
        AndroidJavaObject activity = jc.GetStatic<AndroidJavaObject>("currentActivity");
        if (activity == null)
        {
            Debug.LogError("Failed to obtain Android Activity from Unity Player class.");
            return null;
        }
        return activity;
    }

 

2、Unity 获取 Android 类、类的方法函数、字段属性等

1、通过下述方法即可获取包com.xan.intentreceiver(可类比于C#命名空间)下的类MainActivity。
2、继而可以调用MainActivity的静态方法getIntentResult。
3、其返回值为string,如果无返回值,则直接调用CallStatic即可。
(说明:
1、Call<返回参数>("非静态公共函数名")  调用非静态公共函数
2、CallStatic<返回参数>("静态公共函数名")  调用静公共态函数
3、Get<字段类型>("非静态公共字段名称")   获取非静态公共字段
4、GetStatic<字段类型>("静态公共字段名称")  获取静态公共字段
5、Set<字段类型>("非静态公共字段名称")   设置非静态公共字段
6、SetStatic<字段类型>("静态公共字段名称")  设置静态公共字段
)

using (AndroidJavaClass mainActivityClass = new AndroidJavaClass("com.xan.intentreceiver.MainActivity"))
        {
            Debug.Log("IntentReceiver start catch infomation");
            try
            {
                result = mainActivityClass.CallStatic<string>("getIntentResult");
            }
            catch(Exception ex)
            {
                Debug.Log("IntentReceiver get result failed:" + ex.Message);
            }
        }

 

3、Unity 获取 Android 定义的接口回调,并对应设置的方法

1、Android定义的接口


此处Android端通过接口来实现的回调

package com.xan.Manager;

public class PluginCallback {
    public interface ResultCallback {
        public void OnSuccess(String result, String hint);
        public void OnError(String result, int errorCode);
    }
}

Android层方法:

package com.xan.Manager;
public class Method { 
    public void Execute(PluginCallback.ResultCallback callback){。。。}
    }



2、Unity定义相应的类

接受回调的类:
此类要继承AndroidJavaProxy,同时根据原Android中的接口定义两个同名的方法。
 public delegate void SuccessHandler(string result, string hint);
            public delegate void ErrorHandler(string result, int errorCode);
            class ExecuteCallback : AndroidJavaProxy
            {
                SuccessHandler successHandler;
                ErrorHandler errorHandler;
                public InstallApkCallback(SuccessHandler successCallback,
                                          ErrorHandler errorCallback)
                                        : base("com.xan.Manager.PluginCallback$ResultCallback")
                {
                    successHandler = successCallback;
                    errorHandler = errorCallback;
                }

                public void OnSuccess(string result, string hint)
                {
                    if (successHandler != null)
                        successHandler(result, hint);
                }

                public void OnError(string result, int errorCode)
                {
                    if (errorHandler != null)
                        errorHandler(result, errorCode);
                }
            }


3、Unity 设置使用 Android 对应的接口回调

在new ExecuteCallback(null,null)处填入回调方法。

AndroidJavaObject jo = new AndroidJavaObject("package com.xan.Manager.Method");
jo.Call("Execute",new ExecuteCallback(null,null));

 

三、Unity 直接调用 Android 原生接口的使用案例

大家可以比对两幅代码,学会一些Unity 直接调用 Android 的方法,有时候 Unity Android(原生) 交互 不一定要构建aar/jar包

1、Unity 段代码

    public static string GetSystemLanguage_STCN()
    {
        string systemLanguage;
        if (Application.platform == RuntimePlatform.Android)
        {
           
 
            AndroidJavaObject locale = UnityContext.Call<AndroidJavaObject>("getResources").Call<AndroidJavaObject>("getConfiguration").Get<AndroidJavaObject>("locale");
            if (locale.Call<string>("getLanguage").Equals("zh"))
            {
                if (locale.Call<string>("toLanguageTag").Equals("zh-Hans"))
                {
                    systemLanguage = "简体中文 " + locale.Call<string>("toLanguageTag");
                }
                else if (locale.Call<string>("toLanguageTag").Equals("zh-Hant"))
                {
                    systemLanguage = "繁体中文 " + locale.Call<string>("toLanguageTag");
                }
                else
                { // 第二种简繁中文情况
                    switch (locale.Call<string>("getCountry"))
                    {
                        case "CN":
 
                            systemLanguage = "简体中文 " + locale.Call<string>("toLanguageTag");
                            break;
 
                        default:
                            systemLanguage = "繁体中文 " + locale.Call<string>("toLanguageTag");
                            break;
                    }
                }
            }
            else {
                systemLanguage = "非中文 " + locale.Call<string>("toLanguageTag");
            }
        }
        else
        {
            systemLanguage = Application.systemLanguage.ToString();
        }
 
        return systemLanguage;
    }

 

2、对应同样功能 Android 端代码

    void GeyLanguage(){
 
        Locale locale = getResources().getConfiguration().locale;
        // 获取当前系统语言
 
        String ZH = "zh";
        //中文简体
        String CN_HANS = "zh-Hans";
        //中文繁体
        String CN_HANT = "zh-Hant";
        //如果是中文
        if (locale.getLanguage().equals(ZH)) {
            //locale.toLanguageTag()
            //中国 zh-Hans-CN
            //台湾 zh-Hans-TW
            //澳门 zh-Hans-MO
            //香港 zh-Hans-HK
 
            if (locale.toLanguageTag().contains(CN_HANS)) {
                //简体
                Toast.makeText(this,"当前手机语言环境是 简体",Toast.LENGTH_LONG).show();
            } else if (locale.toLanguageTag().contains(CN_HANT)){
                //繁体
                Toast.makeText(this,"当前手机语言环境是 繁体",Toast.LENGTH_LONG).show();
            } else {
                switch (locale.getCountry()) {
                    case "CN":
                        //简体
                        Toast.makeText(this,"当前手机语言环境是 简体",Toast.LENGTH_LONG).show();
                        break;
                    default:
                        Toast.makeText(this,"当前手机语言环境是 繁体",Toast.LENGTH_LONG).show();
                        break;
                }
            }
        } else {
            Toast.makeText(this,"当前手机语言环境是 不是中文",Toast.LENGTH_LONG).show();
        }
 
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仙魁XAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值