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