Unity之android Drawable数据传递以APPIcon为例
Unity之android Drawable数据传递以APPIcon为例。在Unity开发中,有时候需要与Android端传递数据,比如 Drawable,本节以Unity与Android之间传递Drawable为例,获取Android 的应用Icon,传递给Unity,并显示在UI上;主要思路:因为Unity和Android 之间可以byte[] 之间传递,所以首先把 Drawable 转为 byte[],Android在封装接口供Unity调用即可,具体如下
1、打开Android studio,新建一个空工程,具体如下图
2、在工程中添加一个新模块,设置为 Android Library,用来构建aar 给Unity调用,具体如下图
3、然后在模块中 new Java Class,可以命名为 FileTool,用来做一个图片的格式转换类使用,主要包括 Drawable 格式转为 Bitmap ,Bitmap 转为 byte[]的功能函数,具体如下图
4、FileTool 脚本的具体内容如下:
package com.example.drawableunity;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.util.Base64;
import java.io.ByteArrayOutputStream;
/// 该类用来作为文件工具
/// 1、包括文件格式转换功能
/// 2、Drawable 转为 Bitmap
/// 3、Bitmap 转为 byte[]
public class FileTool {
/// Bitmap 转为 byte[]
public synchronized static byte[] BitmapToByte(Bitmap bitmap) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray();
}
/// byte[] 转为 字符串
public synchronized static String BytesToString(byte[] imagedata) {
return Base64.encodeToString(imagedata, Base64.DEFAULT);
}
/// Drawable 转为 Bitmap
public synchronized static Bitmap DrawableToBitmap(Drawable drawable) {
return (((android.graphics.drawable.BitmapDrawable) drawable).getBitmap());
}
/// byte[] 转为 HexString
public static String bytesToHexString(byte[] src) {
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
}
5、再在模块中 new Java Class,可以命名为 DrawableToUnity,内容主要是,通过包名获取对应的APP icon 得到Drawable图片数据,在转为 byte[] 数据,供Unity调用的接口,具体如下图
6、DrawableToUnity 脚本的具体内容如下:
package com.example.drawableunity;
import android.app.Activity;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
/// 作为给 Unity 调用的类
/// 调用 getDrawableIconByPackageName 即可获得图片 byte[] 数据
public class DrawableToUnity {
/// 外界接口函数
/// 通过包名获取应用的 Drawable icon 并转为 byte[] 数据
public byte[] getDrawableIconByPackageName(String packageName) {
Drawable icon = getAppIcon(packageName);
Bitmap bitmap =FileTool.DrawableToBitmap(icon);
return FileTool.BitmapToByte(bitmap);
}
/// 通过包名获取对应的 Drawable 数据
private Drawable getAppIcon(String packageName) {
try {
PackageManager pm = getActivity().getPackageManager();
ApplicationInfo info = pm.getApplicationInfo(packageName, 0);
return info.loadIcon(pm);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/// 设置一个 Activity 参数
private Activity _unityActivity;
/// 通过反射获取 Unity 的 Activity 的上下文
Activity getActivity(){
if(null == _unityActivity){
try{
Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
_unityActivity = activity;
}catch (ClassNotFoundException e){
e.printStackTrace();
}catch (IllegalAccessException e){
e.printStackTrace();
}catch (NoSuchFieldException e){
e.printStackTrace();
}
}
return _unityActivity;
}
}
7、在 Build - Make Module “????”,把刚才的module 编译生成 aar 包,在文件结构中即可生成的aar,具体如下图
8、在文件夹中打开显示aar包,然后打开Unity,新建一个工程,添加 Plugins - Android 文件结构,把aar拖入 Android 文件夹下,作为插件供Unity调用,具体如下图
9、在工程中新建一个脚本,双击或右键打开进行编辑,具体如下图
10、脚本的大概是,new AndroidJavaObject,在 call 调用对应接口获得对应图标的 byte[]数据,在转为Unity可用的图片数据,在UI上显示,具体如下图
11、脚本内容具体如下:
using UnityEngine;
using UnityEngine.UI;
public class Test : MonoBehaviour {
// 展示获取APPicon的UI参数
public RawImage rawImage;
// android Java 实体的参数
AndroidJavaObject androidJavaObject;
// Use this for initialization
void Start () {
// 其中的参数,是 aar 的 包名 + 对应的 class 名
androidJavaObject = new AndroidJavaObject("com.example.drawableunity.DrawableToUnity");
// 通过安卓类的接口类获取Drawable的byte[],这里以百度地图的为例
// 第一个参数:对应函数接口的名称
// 第二个参数:对应函数接口的包名参数,这里以百度地图包名为例
byte[] drawableBytes = androidJavaObject.Call<byte[]>("getDrawableIconByPackageName",
"com.Baidu.BaiduMap");
// 新建一个 Texture2D 来加载获得的byte[]图像
Texture2D texture2D = new Texture2D(100,100);
texture2D.LoadImage(drawableBytes);
// 在UI上显示获得的 APP icon
rawImage.texture = texture2D;
}
}
12、脚本编译正确,回到Unity,在场景中添加一个 RawImage 图标,把脚本挂载到 Canvas 上,把 RawImage 赋值给脚本,具体如下图
13、把工程切换为 Android 平台,然后编译打包到设备上运行,具体如下图
14、设备上即可获得对应的应用图标显示出来,具体如下图
注意事项:
AndroidJavaObject new的时候注意是 包名+类名,中间点隔开
Unity之android Drawable数据传递以APPIcon为例相关推荐
- Android页面数据传递的两种方式
在android中实现页面中数据的传递有两种方式: 1:第一种数据传递的方式是通过inputExtra方法来进行数据的传递的 2:第二中方法是通过bundle的方法来实现数据的传递的 接下来我们首先来 ...
- Unity 渲染YUV数据 ---- 以Unity渲染Android Camera数据为例子
1 背景 一般Unity都是RGB直接渲染的,但是总有特殊情况下,需要渲染YUV数据.比如,Unity读取Android的Camera YUV数据,并渲染.本文就基于这种情况,来展开讨论. Unity ...
- Android intent数据传递,数据回传
1.intent数据传递,第一个页面数据传到第二个页面 在两个页面中进行数据传递 下面都以intent显式页面跳转为例,,隐式跳转和显示跳转看下面链接 https://blog.csdn.net/qq ...
- Android 之数据传递小结
Android开发中,在不同模块(如Activity)间经常会有各种各样的数据需要相互传递,常用的的有五种传递方式.它们各有利弊,有各自的应用场景.下面分别介绍一下: 1. Intent对象传递简单数 ...
- 基本程序单元Activity—Activity生命周期之数据传递小程序
一. 实验目的 (1) 掌握Andriod Studio的基本使用方法: (2) 掌握Andriod Studio中常用的控件及其使用方法: 二. 实验内容 题目: 编写一个数据传递的小程序,要求在第 ...
- Intent的四种跳转( 1 显式跳转 ,2 隐式跳转 , 3 数据传递 , 4 数据回传)
1 显式跳转 ,2 隐式跳转 , 3 数据传递 , 4 数据回传 关键代码片段: 显式跳转: Intent intent1=new Intent(MainActivity.this,Main2Acti ...
- Android应用开发:页面跳转和数据传递
1. Activity的跳转 1.1 创建第二个Activity 需要在清单文件中为其配置一个activity标签 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标 <intent-fi ...
- Android笔记 Application对象的使用-数据传递以及内存泄漏问题
Application的使用 What is Application Application和Actovotu,Service一样是android框架的一个系统组件,当android程序启动时系统会创 ...
- Android初级开发第七讲--特效和数据传递处理
博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 大家好,相信大家对iphone上的特效早有耳闻,特效不仅给人以 ...
最新文章
- 清华浙大年度学生最高奖,都颁向量子物理
- php中的核心函数有哪些,PHP内核探索:函数的分类
- Javascript学习笔记(三)--变量、作用域和内存问题
- oracle的自动增长,Oracle实现id自动增长
- 「 每日一练,快乐水题 」2006. 差的绝对值为 K 的数对数目
- SAP UI5应用的footer区域绘制原理和入口
- delphi 中如果不进行 closehandle 会怎么样_心理学:当你迷茫了,请坚持做三件事,你的未来会越来越好...
- python矩阵操作_Python中的矩阵操作
- vuejs解析url地址
- 微信小程序中媒体api总结
- 92. php 命名空间(2)
- 【UVALive - 6922】Reverse Polish Notation【贪心】
- 抓包工具_Charles使用
- js 百度坐标和火星坐标的转换
- mysql创建视图演示_mysql怎么创建视图?(图文+视频)
- 服务网格在好未来学而思网校的实践和思考
- 抓取淘宝天猫的商品的促销价格
- 神经网络中warmup策略
- java.lang.ClassNotFoundException: org.springframework.web.servlet.HandlerMapping解决方法
- 布尔类型(bool) 比较器 及sort函数C/C++语言调用