Unity调用安卓接口实现自定义广播监听

一、前言

        在进行某硬件开发时,根据厂商规定的硬件功能接口触发广播,在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#脚本里的“包名”字段便可。

        安卓端自定义广播监听AAR插件包

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

画中影

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

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

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

打赏作者

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

抵扣说明:

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

余额充值