当前位置: 首页 > 知识库问答 >
问题:

如何在Unity中安装Android应用程序图标

长孙宜
2023-03-14

很快,我想获取设备中所有已安装的应用程序(图标和标签)。我正在使用一个简单的代码来获取应用程序的名称。

我使用AndroidJava类来获取这些信息。问题是Android将应用程序图标选择为Drawable。Unity无法读取并显示为Sprite

我想知道是否有办法解决这个问题。我曾尝试将drawable编码为base64字符串,但Unity“回复”我一个“无效字符串长度”错误,可能是因为base64字符串的“无限”长度。

我试图将Drawable转换为字节数组,然后使用它来创建一个纹理与Texture.loadImage(byte[]),但它不起作用。下面是代码:

 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    AndroidJavaObject currentActivity = jc.GetStatic<AndroidJavaObject>("currentActivity");
    int flag = new AndroidJavaClass("android.content.pm.PackageManager").GetStatic<int>("GET_META_DATA");
    AndroidJavaObject pm = currentActivity.Call<AndroidJavaObject>("getPackageManager");
    AndroidJavaObject packages = pm.Call<AndroidJavaObject>("getInstalledApplications", flag);

    int count = packages.Call<int>("size");
    string[] names = new string[count];
    int ii =0;
    for(int i=0; ii<count;){
            //get the object
        AndroidJavaObject currentObject = packages.Call<AndroidJavaObject>("get", ii );
        try{
                //try to add the variables to the next entry
            names[i] = pm.Call<string>("getApplicationLabel", currentObject);
            AndroidJavaObject icon = pm.Call<AndroidJavaObject>("getApplicationIcon", currentObject);//this part is the Java (Android Studio) code using Android Java Object and Class of Unity. Maybe the error is from here
            AndroidJavaObject bitmap = icon.Call<AndroidJavaObject>("getBitmap");
            AndroidJavaClass stream = new AndroidJavaClass("java.io.ByteArrayOutputStream");
            bitmap.Call("compress",(new AndroidJavaClass("java.io.ByteArrayOutputStream")).Call<AndroidJavaObject>("JPEG"), 100, stream);
            byte[] bitMapData = stream.Call<byte[]>("toByteArray");//to here
            Texture2D mytexture = new Texture2D(50, 50); // no idea what default size would be?? is it important??
            if (!mytexture.LoadImage(bitMapData)) {
                Debug.Log("Failed loading image data!");
            }
            else {
                Debug.Log("LoadImage - Still sane here - size: " + mytexture.width + "x" + mytexture.height);
                GameObject app = (GameObject)Instantiate(App, Vector3.zero, Quaternion.identity);
                app.GetComponent<RawImage>().texture = mytexture;//here is the code should display the icon as texture (sprite would be the best)
            }
            i++;
            ii++;
        }
        catch(Exception e){
            Debug.LogError(e,this);
                //if it fails, just go to the next app and try to add to that same entry.
            ii++;
        }

    }

以下是Java Android Studio的工作代码:

        Bitmap bitmap = ((BitmapDrawable) item.getIcon()).getBitmap(); //item.getIcon() returns the Drawable correctly
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
        byte[] byteArray = baos.toByteArray();

共有1个答案

徐瀚
2023-03-14

我在Android Studio上创建了一个Android Jar插件(无活动),然后将其导入Unity3D(AndroidManifest.xml和Assets中的classes.Jar)

public class PluginClass {

public static byte[] getIcon(PackageManager pm, ApplicationInfo applicationInfo) {
    try {
        BitmapDrawable icon = (BitmapDrawable) pm.getApplicationIcon(applicationInfo);
        Bitmap bmp = icon.getBitmap();
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[] byteArray = stream.toByteArray();
        return byteArray;
    } catch (Exception e) {
        return null;
    }
}

public static boolean isSystem(ApplicationInfo applicationInfo){
    return (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM ) != 0;
   }
}
Then I have invoked it in Unity C# script:

void Start () {
    AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    AndroidJavaObject currentActivity = jc.GetStatic<AndroidJavaObject>("currentActivity");
    int flag = new AndroidJavaClass("android.content.pm.PackageManager").GetStatic<int>("GET_META_DATA");
    AndroidJavaObject pm = currentActivity.Call<AndroidJavaObject>("getPackageManager");
    AndroidJavaObject packages = pm.Call<AndroidJavaObject>("getInstalledApplications", 0);
    int count = packages.Call<int>("size");
    string[] names = new string[count];
    List<byte[]> byteimg = new List<byte[]>();
    int ii =0;
    for(int i=0; ii<count;){
        AndroidJavaObject currentObject = packages.Call<AndroidJavaObject>("get", ii );
        try{
            names[i] = pm.Call<string>("getApplicationLabel", currentObject);
            var plugin = new AndroidJavaClass("com.mypackagename.PluginClass");
            if(plugin.CallStatic<bool>("isSystem",currentObject)){
                ii++;
                continue;
            }
            byte[] decodedBytes = plugin.CallStatic<byte[]>("getIcon", pm, currentObject);
            Texture2D text = new Texture2D(1, 1, TextureFormat.ARGB32, false);
            text.LoadImage(decodedBytes);
            Sprite sprite = Sprite.Create (text, new Rect(0,0,text.width,text.height), new Vector2(.5f,.5f));
            i++;
            ii++;
        }
        catch(Exception e){
            Debug.LogError(e,this);
            ii++;
        }

    }
 类似资料:
  • 我对使用Android Studio完全陌生,我正在尝试在模拟器上安装Google Play应用程序。我已经从SDK管理器安装了Google Repository(谷歌存储库)和Google Play Services(谷歌播放服务)以及Google API x86 Atom系统映像,并且我能够为我的示例应用程序设置Google Play Services(谷歌播放服务)。 我现在想在我的模拟器上

  • 在Android 9中 我还在清单文件中添加了必需的权限。 当我运行这个程序时,它告诉我解析包错误时出现了问题。

  • 昨天,我的应用程序在上运行得很完美,但今天,当我开始使用我的应用程序并运行它时,我却不断收到错误消息 安装失败,出现消息“未能建立会话”。 屏幕: 单击“确定”获得错误消息 会话“app”:安装apk时出错 并且设备中不存在(已卸载)应用程序。请建议我怎么做?

  • 我无法通过Android Studio或手动复制APK在我的联想Phab PLUS(联想PB-1 770M,Android 5.1.1 API 22)上安装我的应用程序。 通过Android Studio:我得到错误失败安装APK[INSTALL_FAILED_DEXOPT]。它提示我,手机上可能有一个现有的应用程序,带有相同的过时的德克斯罐包,并提示我卸载现有的应用程序。然而,当我继续"是",它

  • 我找到了Java的代码片段。我如何用C#Unity编写这样的代码?

  • 问题内容: 我想以特定尺寸在Android应用程序中显示图片。我该怎么做?请指导我?还有一件事,我想从SD卡中获得该图像。所以请帮帮我。 提前致谢。 问题答案: 首先,您需要创建一个imageview。 创建布局参数以在布局上添加imageview 然后获取您的图像路径 在ImageView上设置图像 获取您要添加的布局 将视图添加到布局