Unity之android Drawable数据传递以APPIcon为例

本文以获取Android应用Icon并传递给Unity显示在UI上为例,介绍了Unity与Android间Drawable数据传递的方法。先将Drawable转为byte[],Android封装接口供Unity调用。详细说明了在Android studio创建工程、编译aar包,以及在Unity中调用aar包获取图标数据的步骤。

       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的时候注意是 包名+类名,中间点隔开

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

仙魁XAN

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

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

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

打赏作者

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

抵扣说明:

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

余额充值