[Unity安卓开发][使用篇]Unity&Android交互基础

Unity对Java的使用

Jar包文件

Java Archive File 也就是所谓的Jar包,将多个java文件合并为一个文件,我们平时接触到的最多的文件形式。

AAR文件

Android Archive一个带有资源文件的第三方库文件结构。相比于Jar包除了含class文件,还包含resource文件,目前比较推荐的方式。

Java类文件

目前Unity2018+是支持直接编译Java文件,只需要将Java文件放在你的项目里即可。

Unity对Java的封装

AndroidJavaObject

AndroidJavaObject 是 java.lang.Object 的Unity 表示,可以理解为Java Object的化身。可以用过指定Object的来源来构造对应的Java实例。

AndroidJavaObject中文文档

AndroidJavaObject javaString = new AndroidJavaObject("java.lang.String");

java.lang.String组成是由package和class或者interface组成,也就是 "java.lang.String"是package,而"String"是class。

如果要是获取类中的内部类或者内部接口应该用"$"作为标识。如:android.app.DatePickerDialog$OnDateSetListener。这里android.app是package,而"DatePickerDialog"是class,而"OnDateSetListener"是的内部接口。

主要的几个api的使用:

Call方法

调用实例对象Java 方法,这里不是静态方法。

CallStatic方法

调用实例对象静态方法。

Get方法

调用Java 实例对象的字段值。

GetStatic方法

调用Jave的静态字段值。

Set方法

设置Java实例对象的字段值

SetStatic方法

设置Jave的静态字段值。

Dispose方法

释放这个对象。

AndroidJavaClass

AndroidJavaClass中文文档

AndroidJavaClass 是 java.lang.Class 的Unity 表示,可以理解为Java Class的化身。继承自AndroidJavaObject。需要通过构造来指定这个Class的来源。

AndroidJavaClass javaStringClass = new AndroidJavaClass("java.lang.String");

AndroidJavaProxy

AndroidJavaProxy中文文档

AndroidJavaProxy用于实现任何 Java 接口。与代理对象中的接口匹配的任何 Java vm 方法调用都将自动传递给 c# 实现。 

class ExampleClass : MonoBehaviour
{
    private static DateTime selectedDate = DateTime.Now;

    class DateCallback : AndroidJavaProxy
    {
        /// <summary>
        /// 实现来自android.app.DatePickerDialog的OnDateSetListener接口
        /// </summary>
        public DateCallback() : base("android.app.DatePickerDialog$OnDateSetListener") { }
        /// <summary>
        /// 接口的实现方法,这里一定要和Java接口对上
        /// </summary>
        /// <param name="view"></param>
        /// <param name="year"></param>
        /// <param name="monthOfYear"></param>
        /// <param name="dayOfMonth"></param>
        void onDateSet(AndroidJavaObject view, int year, int monthOfYear, int dayOfMonth)
        {
            selectedDate = new DateTime(year, monthOfYear + 1, dayOfMonth);
        }
    }

    void OnGUI()
    {
        if (GUI.Button(new Rect(15, 15, 450, 75), string.Format("{0:yyyy-MM-dd}", selectedDate)))
        {
            //这里通过AndroidJavaClass获取UnityPlayer类并且获取currentActivity字段值,也就是当前我们的Activity,获取currentActivity这里返回的是AndroidJavaObject而不是AndroidJavaClass。
            AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
            //这里启动了在UI线程运行的实例,AndroidJavaRunnable等同于java.lang.Runnable,Runnable接口是线程辅助类,仅定义了一个方法run()方法,主要实现多线程
            activity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
            {
                //这里的代码等用于Java 代码:
                //new DatePickerDialog(activity, new OnDateSetListener(), year, month, day).show();
                new AndroidJavaObject("android.app.DatePickerDialog", activity, new DateCallback(), selectedDate.Year, selectedDate.Month - 1, selectedDate.Day).Call("show");
            }));
        }
    }
}

AndroidJavaRunnable

AndroidJavaRunnable 是 java.lang.Runnable 对象的 Unity 表示。

AndroidJavaRunnable中文文档

请注意,这是一个委托。因此,每次将其作为参数传递给 Java 时,都会创建一个新的 java.lang.reflect.Proxy 对象。这意味着多次向 Java 传递 AndroidJavaRunnable 类型的变量时,每次均会生成一个具有不同哈希码值的新 Java 对象。这也意味着,对 Java 对象(创建为 AndroidJavaRunnable 变量的表示)调用 equals() 将始终返回 false,即使在与自身比较时也如此。

权限请求接口

用于权限的检查和申请

Permission

用于Android权限结构管理的类。

Unity官方文档连接不在过多详述使用https://docs.unity3d.com/cn/current/ScriptReference/Android.Permission.html
Android权限说明文档https://developer.android.google.cn/guide/topics/permissions/overview#permission-groups

Unity提供的预定义权限有限可以直接写入对应权限的常量值。比如说允许应用程序通过NFC执行I/O操作。权限我们可以直接使用:

 Permission.RequestUserPermission("android.permission.NFC");

权限常量值文档https://developer.android.google.cn/reference/android/Manifest.permission

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值