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

news2024/12/31 5:50:02

编写本文是因为找了很多文章,都比较片段,不容易理解,对于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() {
        @Override
        public 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 update
    void 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.coloradmin.cn/o/2037750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI智能网关 边缘计算 视觉AI

随着人工智能技术的不断发展&#xff0c;AI智能网关正成为连接现实世界和虚拟智能世界的重要桥梁。作为智能化时代的关键设备&#xff0c;AI智能网关在物联网、工业、市政、无人驾驶、农业、环保、水利等领域起到了至关重要的作用。   首先&#xff0c;AI智能网关是物联网的核…

转行大模型成功进字节了!48k*15薪!

以ChatGPT为代表的大模型技术的出现&#xff0c;让算法工程师重新成了炙手可热的岗位。 现在国内各家大小厂都在搞大模型算法&#xff0c;投入了巨量的人力物力财力&#xff0c;都不愿意放弃这个百年难遇的机会&#xff0c;像字节&#xff0c;腾讯&#xff0c;京东等大厂也增加…

数学建模笔记(1):插值法

1.插值法的用途 在对数据进行处理的时候&#xff0c;我们往往会碰到由于数据量比较小的情况&#xff0c;这样的情况不利对数据进行分析。插值法就是是针对这种情况&#xff0c;模拟产生和原来数据相近的数据来为数据分析提供完整可靠的数据。 总结&#xff1a;插值法是一种自己…

RAG应用深度解析:文件解析与内容提取的技术突破

在了解完[# 落地RAG系列&#xff1a;RAG入门及RAG面临的挑战和解决方案&#xff01;&#xff01;]Naive RAG工作流程以及Naive RAG存在的问题后&#xff0c;我们将先从离线部分的文件解析开始技术分析与落地&#xff0c;朝着高级RAG的方向前进&#xff01; 文件解析的难点 在R…

Keepalived 高可用集群详解和配置

Keepalived 高可用集群 集群类型 1、LB&#xff08;Load Balance&#xff09;&#xff1a;负载均衡 LVS&#xff1a;四层负载均衡 HAProxy&#xff1a;七层/四层 负载均衡 nginx&#xff1a;七层负载均衡 (http/upstream,stream/upstream) 2、HA&#xff08;High Availa bili…

fastapi之WebSockets

文章目录 WebSockets基本概念FastAPI 中的 WebSocket 支持WebSocket 应用示例示例 1: 简单的 WebSocket 连接解释 示例 2: 广播消息的 WebSocket 实现解释 客户端代码示例 完整示例项目结构服务器端代码 (main.py)解释 简单的前端客户端 (static/index.html)解释 测试 相关代码…

交通拥堵辅助与自动化

Traffic-Jam Assistance and Automation 交通拥堵辅助与自动化 Abstract Traffic jams are situations where a high degree of automation could give a large benefit to customers. In addition, the relatively simple situation of a traffic jam means that a high deg…

使用pytest+selenium编写网页UI自动化脚本和用例

1 UI自动化测试 UI自动化测试&#xff08;User Interface Automation Testing&#xff09;是一种通过编写脚本或使用自动化测试工具&#xff0c;对界面&#xff08;UI&#xff09;进行自动化测试的方法。原理主要是模拟用户打开客户端或网页的UI界面&#xff0c;自动化执行用户…

C语言学习——函数(数组作为函数参数)

目录 8.7数组作为函数参数 数组元素作函数实参 数组名作参数函数 8.7数组作为函数参数 我们知道可以用变量作函数参数&#xff0c;显然&#xff0c;数组元素也可以作函数实参&#xff0c;其用法与变量相同。此外&#xff0c;数组名也可以作实参和形参&#xff0c;传递的是数…

【区块链教程】如何使用自动化脚本创建小狐狸地址

在很多场景下&#xff0c;不管是撸毛也好&#xff0c;批量操作也好&#xff0c;都需要使用到大量的qianbao地址。 如何一键创建&#xff0c;也成为了很多人想学的技术。 创建地址的自动化脚本可以极大地简化在区块链开发和测试中的管理流程。以下是一个基本的流程和示例脚本&am…

知识竞赛中必答题环节竞赛规则有哪些设计方案

必答题环节被广泛用到各类知识竞赛活动中&#xff0c;往往被安排在第一环节&#xff0c;是知识竞赛中的热身环节。那么&#xff0c;常用的必答题环节规则应怎么设计呢&#xff1f;下面列出的这些大家可以参考一下。 1.可以分个人必答题和团队必答题。个人必答题可以分别记个人…

为什么要用static

前言 本文主要介绍C/C中的static&#xff0c;以及为什么要用static&#xff0c;别人的代码中有时会突然使用用static&#xff0c;看的一脸蒙圈&#xff0c;为什么要用static&#xff0c;我不用难道不行吗&#xff1f;对啊为什么呢&#xff1f; 正文 static是C/C中一个很重要…

浅试扫雷游戏(简易版)

目录 1. 扫雷游戏分析和设计 1&#xff09;扫雷游戏的功能说明 2&#xff09;游戏的分析和设计 2.扫雷游戏的代码实现 1. 扫雷游戏分析和设计 1&#xff09;扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格子…

“前缀和”专题篇二

目录 和为K的子数组 和可被K整除的子数组 连续数组 矩阵区域和 和为K的子数组 题目 思路 我们可能想到的是&#xff0c;从头到尾扫描数组&#xff0c;然后分别计算以该位置为开始&#xff0c;一直到数组末尾&#xff0c;符合和为K的子数组&#xff0c;但是这种方法的时间复…

线上研讨会 | CATIA助力AI提升汽车造型设计

报名链接&#xff1a; 2024探索之旅第二季

Linux Shell基础常用脚本命令及应用案例

文章目录 常用的 Shell 命令1. 变量2. 注释3. 输出4. 输入5. 条件判断6. 循环7. 函数8. 运算9. 流程控制10. 文件和目录操作11. 错误处理 Shell 脚本应用案例1. Hello World 脚本2. 创建系统账户及设置密码3. 日志文件备份4. 一键部署 LNMP 环境5. 检查磁盘空间6. 自动安装软件…

Nginx反向代理的使用场景

Nginx Vue使用npm命令打包&#xff1a;npm run build Nginx的定位&#xff1a;主要用于做反向代理&#xff0c;一般都是用它来做前端页面的服务器&#xff0c;动态资源代理到后端服务器。这样做的好处是可以避免跨域请求带来的不便。 我们知道&#xff0c;在前端我们开发的时…

三、AI工作流(低代码)的趋势即将崛起,输入-按钮组件详解,带你轻松玩转按钮组件

对工作流感兴趣的小伙伴可以去试一试。&#x1f525;偷偷的告诉你&#xff0c;它的GPTo4.0 不要&#x1f4b0;。传送门&#xff1a;https://www.nyai.chat/chat?invitenyai_1141439 一、能用AI工作流介绍 能用AI-工作流是一个“低代码”工具、它也是个人或者中小企业的提效工…

C#语言基础速成Day07

“知止而后有定&#xff0c;定而后能静&#xff0c;静而后能安&#xff0c;安而后能虑&#xff0c;虑而后能得。” 目录 前言文章有误敬请斧正 不胜感恩&#xff01;||Day07 C#常见数据结构&#xff1a;1. 集合&#xff08;Collection&#xff09;1.1 **List<T>**1.2 **H…

MATLAB 样条插值

订阅专栏后,复制完整代码到MATLAB上面,即可获得跟本文相同的运行结果。 点击以下链接也可下载: https://download.csdn.net/download/callmeup/89635701 MATLAB插值代码 插值在MATLAB里面很简单,一个函数即可。 本文给出了已知点的坐标、待插值点的横坐标,可按要求插出来…