一、前言
在进行某硬件开发时,根据厂商规定的硬件功能接口触发广播,在Android Studio中封装广播接收器和回调接口,导出AAR包供Unity调用,Unity端通过C#脚本调用AAR内部封装的接口。
二、安卓交互功能封装
1、Java类创建
(1)创建方法调用类
此类用于创建供Unity端调用的方法,具体代码如下:
import android.content.Context;
import android.content.IntentFilter;
public class BroadcastReceiverUtils {
private Context mContext;
private static BroadcastReceiverUtils mBroadcastReceiverUtils = null;
private MyBroadcastReceiver mBroadcastReceiver;
public static StateInterface stateInterface = null;
public BroadcastReceiverUtils(Context context){
this.mContext = context;
}
public static BroadcastReceiverUtils getInstance(Context context){
if(mBroadcastReceiverUtils == null){
mBroadcastReceiverUtils = new BroadcastReceiverUtils(context);
}
return mBroadcastReceiverUtils;
}
//注册广播
public void registerBroadcast(String broadcastValue){
if(mBroadcastReceiver == null){
mBroadcastReceiver = new MyBroadcastReceiver();
}
mBroadcastReceiver.broadcastValue = broadcastValue;
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(broadcastValue);
mContext.registerReceiver(mBroadcastReceiver,intentFilter);
}
//取消注册广播
public void unregisterBroadcast(){
if(mBroadcastReceiver != null){
mContext.unregisterReceiver(mBroadcastReceiver);
mBroadcastReceiver = null;
}
}
//设置事件接口
public void setStateInterface(StateInterface mInterface){
stateInterface = mInterface;
}
}
(2)创建回调接口
此接口会在接收到广播后执行,具体实现在Unity端完成,具体代码如下:
public interface StateInterface {
public void onEvent();
}
(3)创建广播接收器
广播接收器用于接收设备广播,并调用回调接口,具体代码如下:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyBroadcastReceiver extends BroadcastReceiver {
public String broadcastValue;
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(broadcastValue)){
BroadcastReceiverUtils.stateInterface.onEvent();
}
}
}
以上代码中,broadcastValue是广播时发出的广播信号值,由硬件设备厂商确定,此值会在注册广播时传入。
2、构建AAR包
选中模块,点击Build-->Make Module,或者直接Build-->Rebuild Project。
待编译完成后,在模块-->build-->outputs-->aar里便可找到编译好的AAR包。
三、Unity调用
1、AAR包放置
直接将AAR包拖放至Unity的Assets-->Plugins-->Android路径下(没有则自己创建)。
2、创建C#脚本,调用AAR包
(1)安卓配置类
用于Java端单例调用的统一配置。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class AndroidConfig
{
/// <summary>
/// 获取安卓端单例
/// </summary>
/// <param name="javaClass"> 安卓端JavaClass 格式:包名.类名 </param>
/// <returns> AndroidJavaObject </returns>
public static AndroidJavaObject AndroidJavaObject(string javaClass)
{
AndroidJavaObject androidJavaObject;
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass utilsClass = new AndroidJavaClass(javaClass);
androidJavaObject = utilsClass.CallStatic<AndroidJavaObject>("getInstance", currentActivity);
return androidJavaObject;
}
}
(2)回调接口
创建C#类,继承AndroidJavaProxy,用于匹配Java端回调接口。
using System.Collections.Generic;
using UnityEngine;
using System;
public class StateInterface : AndroidJavaProxy
{
Action mOnEvent;
public StateInterface(Action OnEvent) : base("包名.StateInterface")
{
mOnEvent = OnEvent;
}
public void onEvent()
{
mOnEvent?.Invoke();
}
}
注意,此处回调方法名onEvent要与Java端回调接口的方法名保持一致。以上代码中的“包名”字段表示Java端的模块包名,即com.xx.xx格式。
(3)调用类
写入以下内容,用来调用AAR包里的函数接口。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BroadcastReceiverUtils : MonoBehaviour
{
public string broadcastValue;
private AndroidJavaObject androidUtils;
private void Awake()
{
androidUtils = AndroidConfig.AndroidJavaObject("包名.BroadcastReceiverUtils");
}
// Start is called before the first frame update
void Start()
{
//设置回调接口
SetStateInterface(new StateInterface(OnEvent));
//注册广播
androidUtils.Call("registerBroadcast", broadcastValue);
}
private void OnDestroy()
{
//取消注册广播
androidUtils.Call("unregisterBroadcast");
}
//设置回调接口
private void SetStateInterface(StateInterface stateInterface)
{
androidUtils.Call("setStateInterface", stateInterface);
}
//广播回调
public void OnEvent()
{
//添加接收到广播后执行事件逻辑
}
}
以上代码中的“包名”字段表示Java端的模块包名,即com.xx.xx格式。broadcastValue变量即为要传入的广播信号值,在Start方法里设置回调接口和注册广播接收器,在OnDestroy方法里取消注册广播接收器。OnEvent方法具体实现回调接口逻辑。
四、AAR包资源下载入口
如果有小伙伴看了以上教程还不知道如何使用,可以直接下载以下AAR包直接使用,里面有插件的包名,替换掉C#脚本里的“包名”字段便可。