Unity 编写自己的aar库,接收Android广播(broadcastReceiver)并传递到Unity

news/2024/9/22 21:28:36/

编写本文是因为找了很多文章,都比较片段,不容易理解,对于Android新手来说理解起来不友好。我这里写了一个针对比较小白的文章,希望有所帮助。

Android端

首先还是先来写Android端,我们新建一个Android空项目,并添加一个Module,具体可以参考这篇《Unity 编写自己的aar库,并通过AndroidJavaProxy调用访问和返回》,我们给Module命名AndroidJFramework,还是一个Library类型。

添加Unity Jar

因为要给Unity传送消息,要使用到UnityPlayer类,所以我们需要把Unity的Lib复制到安卓里,我这里使用的2022.3.17,路径是\Unitys\2022.3.17f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

在这里插入图片描述

我们回到Android,建立了Libs目录并把这个jar复制到安卓的项目里,重命名为calsses_unity.jar
如下图:
在这里插入图片描述


添加了新库,要在build.gradle中添加引用

implementation files('src\\Libs\\classes_unity.jar')

或者还可以在这个jar上点击右键,进行添加
如下图:
在这里插入图片描述




这样gradle文件中会自动添加,如下图:
在这里插入图片描述


最后改完gradle文件,记得sync一下,在菜单的File->Sync Project with Gradle Files

在这里插入图片描述

前期工作做完了,然后我们开始编写Android脚本。

编写Android脚本

我们这里编写两个类

package com.lg.AndroidJFramework;public interface UnityBroadcasterInterface {void onReceive(String action,String msg);}

这个UnityBroadcasterInterface是一个interface,因为Unity只能访问interface。

package com.lg.AndroidJFramework;import android.content.Context;import com.unity3d.player.UnityPlayer;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;public class UnityBroadcaster
{public UnityBroadcasterInterface mInterface;//广播处理并回调Unity中OnReceive()方法private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();Log.d("test", "UnityBroadcastHelper: action: " + action);Bundle bundle = intent.getExtras();if (bundle == null) {bundle = new Bundle();}int n = bundle.size();int i = 0;String parm = "";for (String key : bundle.keySet()) {Object value = bundle.get(key);String omsg = String.format("{ \"%s\" : \"%s\" , \"%s\" : \"%s\" }","id",key,"value",value.toString());parm += omsg;i++;if(i < n)parm += ",";}parm = "{\"data\":["+parm+"]}";mInterface.onReceive(action,parm);}};//构造函数public UnityBroadcaster(UnityBroadcasterInterface callback){mInterface = callback;Context context = UnityPlayer.currentActivity;if (context == null) {Log.e("test","找不到Unity");return;}IntentFilter ifs = new IntentFilter();ifs.addAction("com.lg.updateandroid");context.registerReceiver(broadcastReceiver, ifs);}}

这个UnityBroadcaster类是负责接收广播,并把广播通过mInterface.onReceive(action,parm)传递给Unity。
IntentFilter是广播的过滤,改成你的自定义名称。接收到的广播消息,我拼接成了json格式数据传递给Unity。

最后我们就可以进行编译了。

编译

在这里插入图片描述
我们点击Make Module,运行完成后我们来到build目录就可以找到aar文件。我的是在
E:\AndroidProjects\AndroidJFrameWork\AndroidJFramework\build\outputs\aar
在这里插入图片描述
我们把这个文件复制到Unity项目Plugins\Android目录下。
如下图位置:
在这里插入图片描述


这里我们要进行一个操作,用Winrar把aar文件打开,把Libs里的unity.jar删除掉
在这里插入图片描述
如果没有删除我们在打包的时候可能会出现如下报错:
Duplicate class bitter.jnibridge.JNIBridge found in modules AndroidJFramework-debug-runtime

在这里插入图片描述
提示我们有重复的类JNIBridge .

到这里Android部分就完成了,看起来一大堆操作,其实还是挺简单的。

Unity端

主脚本

Unity里我们也是添加两个脚本。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UnityBroadcaster : AndroidJavaProxy
{[Serializable]public class RecData{public string id;public string value;}[Serializable]public class RecDataList{ public RecData[] data;}AndroidJavaObject javaObject;public UnityBroadcaster() : base("com.lg.AndroidJFramework.UnityBroadcasterInterface"){javaObject = new AndroidJavaObject("com.lg.AndroidJFramework.UnityBroadcaster", this);}public void onReceive(string action,string msg){RecDataList list = new RecDataList();Debug.Log("Unity onReceive :" + action + msg);list = JsonUtility.FromJson<RecDataList>(msg);for (int i = 0; i < list.data.Length; i++){RecData data = list.data[i];Debug.Log(data.id + " : " + data.value);}}
}

我们建立主脚本UnityBroadcaster ,继承自AndroidJavaProxy。构造函数我们这里的base后面就是包名+interface的名称,例如我的是com.lg.AndroidJFramework.UnityBroadcasterInterface。

javaObject是实例化这个Java对象,需要用包名+类名,例如我的是com.lg.AndroidJFramework.UnityBroadcaster

这两个名称绝对不能错误,请自定修改。

实例化脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityBroadcaster;public class BroadcasterLoad : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){new UnityBroadcaster();}}

AndroidJavaProxy脚本没办法挂在对象上,所以我们建立一个脚本,直接new,挂在主场景对象上。
然后直接进行Unity打包就可以了。

测试

我是从另外一个app上发送的广播,不在本例arr安卓端,你可以自行建立一个带窗体按钮的app,点击按钮发送广播就可以了。

Intent intent=new Intent();
intent.setAction("com.lg.updateandroid");//广播的名字,过滤使用
intent.putExtra("msg1", "haha1");//指定广播内容
intent.putExtra("msg2", "hehe1");//指定广播内容
mContext.sendBroadcast(intent); //发送广播

发送广播后我们可以看到输出的内容:
在这里插入图片描述

参考

https://www.programmersought.com/article/51956081045/
https://vuopaja.com/tutorials/android-java-proxy


http://www.ppmy.cn/news/1509096.html

相关文章

spring data:核心概念与应用(1)

文章目录 核心概念定义Repository接口Repository 微调 投影 使用过 JPA 的同学比较了解在 Spring 体系的 web 服务开发中&#xff0c;有个比较方便的 dao 工具 repository&#xff0c;并伴随着 Entity 形成的一系列方法能大大加快开发进程&#xff0c;本系列就以 Spring Data 系…

MTF-SFR总结/探讨

空间频率响应&#xff08;SFR&#xff09;定义 在iso12233:2000中&#xff0c;空间频率响应&#xff08;SFR&#xff09;测量被定义为通过分析倾斜黑白边缘附近的相机数据而测量的值。 图像清晰度测试方法 通过ISO12233测试图像清晰度的方法&#xff0c;一般有 TVline测试和S…

basic_pentesting_2靶机

靶机地址&#xff1a;Basic Pentesting: 2 ~ VulnHub 攻击机kali和靶机要设在同一网段&#xff0c;查看靶机MAC地址&#xff1a; 一、信息收集 扫描目标主机 arp-scan -l 使用nmap扫描靶机开放的端口&#xff1a; nmap -A -sS -sV -v -p- 192.168.7.127 浏览器访问80端口&a…

git-贮藏区打补丁

1.显示所有贮藏 git stash list 2.将贮藏区的修改打补丁 git stash show -p stash{0} > patchName.patch commit打补丁 git 生成补丁文件及打补丁_git 生成指定目录补丁-CSDN博客 git patch的使用方法_git pattch-CSDN博客

STM32低功耗与备用备份区域

STM的备份备用区域其实就是两个区块&#xff1a;BKP和RTC。低功耗则其实是STM32四种模式中的三种耗能很低的模式。 目录 一&#xff1a;备用区域 1.BKP 2.RTC 二&#xff1a;低功耗模式 1.睡眠模式&#xff1a; 2.停机模式&#xff1a; 3.待机模式&#xff1a; 一&…

oracle 保留两位小数

在Oracle数据库中&#xff0c;保留两位小数可以通过多种函数实现&#xff0c;主要包括ROUND、TRUNC和TO_CHAR函数。每种函数都有其特定的使用场景和效果。 1. ROUND函数 ROUND函数用于对数值进行四舍五入操作&#xff0c;保留指定的小数位数。其基本语法为&#xff1a; ROUN…

大数据面试SQL(七):累加刚好超过各省GDP40%的地市名称

文章目录 累加刚好超过各省GDP40%的地市名称 一、题目 二、分析 三、SQL实战 四、样例数据参考 累加刚好超过各省GDP40%的地市名称 一、题目 现有各省地级市的gdp数据,求从高到低累加刚好超过各省GDP40%的地市名称&#xff0c;临界地市也需要。 例如&#xff1a; 浙江省…

《全面解析 Nginx:从下载安装到高级应用与问题解决》

Nginx 一、Nginx 简介 什么是 Nginx 以及其功能 Nginx 是一款高性能的 HTTP 和反向代理的 Web 服务器&#xff0c;在处理高并发方面表现卓越&#xff0c;具备强大的能力来承受高负载&#xff0c;有相关报告指出其能够支持高达 50,000 个并发连接数。其显著特点为占用内存少、…