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为例相关推荐

  1. Android页面数据传递的两种方式

    在android中实现页面中数据的传递有两种方式: 1:第一种数据传递的方式是通过inputExtra方法来进行数据的传递的 2:第二中方法是通过bundle的方法来实现数据的传递的 接下来我们首先来 ...

  2. Unity 渲染YUV数据 ---- 以Unity渲染Android Camera数据为例子

    1 背景 一般Unity都是RGB直接渲染的,但是总有特殊情况下,需要渲染YUV数据.比如,Unity读取Android的Camera YUV数据,并渲染.本文就基于这种情况,来展开讨论. Unity ...

  3. Android intent数据传递,数据回传

    1.intent数据传递,第一个页面数据传到第二个页面 在两个页面中进行数据传递 下面都以intent显式页面跳转为例,,隐式跳转和显示跳转看下面链接 https://blog.csdn.net/qq ...

  4. Android 之数据传递小结

    Android开发中,在不同模块(如Activity)间经常会有各种各样的数据需要相互传递,常用的的有五种传递方式.它们各有利弊,有各自的应用场景.下面分别介绍一下: 1. Intent对象传递简单数 ...

  5. 基本程序单元Activity—Activity生命周期之数据传递小程序

    一. 实验目的 (1) 掌握Andriod Studio的基本使用方法: (2) 掌握Andriod Studio中常用的控件及其使用方法: 二. 实验内容 题目: 编写一个数据传递的小程序,要求在第 ...

  6. Intent的四种跳转( 1 显式跳转 ,2 隐式跳转 , 3 数据传递 , 4 数据回传)

    1 显式跳转 ,2 隐式跳转 , 3 数据传递 , 4 数据回传 关键代码片段: 显式跳转: Intent intent1=new Intent(MainActivity.this,Main2Acti ...

  7. Android应用开发:页面跳转和数据传递

    1. Activity的跳转 1.1 创建第二个Activity 需要在清单文件中为其配置一个activity标签 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标 <intent-fi ...

  8. Android笔记 Application对象的使用-数据传递以及内存泄漏问题

    Application的使用 What is Application Application和Actovotu,Service一样是android框架的一个系统组件,当android程序启动时系统会创 ...

  9. Android初级开发第七讲--特效和数据传递处理

    博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 大家好,相信大家对iphone上的特效早有耳闻,特效不仅给人以 ...

最新文章

  1. 清华浙大年度学生最高奖,都颁向量子物理
  2. php中的核心函数有哪些,PHP内核探索:函数的分类
  3. Javascript学习笔记(三)--变量、作用域和内存问题
  4. oracle的自动增长,Oracle实现id自动增长
  5. 「 每日一练,快乐水题 」2006. 差的绝对值为 K 的数对数目
  6. SAP UI5应用的footer区域绘制原理和入口
  7. delphi 中如果不进行 closehandle 会怎么样_心理学:当你迷茫了,请坚持做三件事,你的未来会越来越好...
  8. python矩阵操作_Python中的矩阵操作
  9. vuejs解析url地址
  10. 微信小程序中媒体api总结
  11. 92. php 命名空间(2)
  12. 【UVALive - 6922】Reverse Polish Notation【贪心】
  13. 抓包工具_Charles使用
  14. js 百度坐标和火星坐标的转换
  15. mysql创建视图演示_mysql怎么创建视图?(图文+视频)
  16. 服务网格在好未来学而思网校的实践和思考
  17. 抓取淘宝天猫的商品的促销价格
  18. 神经网络中warmup策略
  19. java.lang.ClassNotFoundException: org.springframework.web.servlet.HandlerMapping解决方法
  20. 布尔类型(bool) 比较器 及sort函数C/C++语言调用

热门文章

  1. 推荐 8 个我私藏的大厂技术大佬公众号 !助你高速成长!
  2. Java实现文件查重去重
  3. 解决win7 处理器,安装内存不可用
  4. 江苏援沪“大白”们,用手绘漫画为上海加油
  5. 最受DBA欢迎的数据库技术文档-巡检篇
  6. Windows Server之浅谈SMB以及SMB小案例分享
  7. linux 设置每天定时重启
  8. 脚本显示服务器超时,服务器诡异的请求超时问题
  9. 什么是WAF?WAF的功能有哪些?
  10. fscanf php,php fscanf 函数_PHP教程