Android obtient les informations sur l'application via le nom du package et ouvre l'application

1. Package de fonctions interactives Android

        La création de projets spécifiques, la création de modules, la création de classes Java et d'autres traitements ne seront pas développés ici. Pour plus de détails, voir : Utilisation d'Android WebView

        Ce document sert uniquement à spécifier le nom du package pour obtenir l'icône et le nom d'une application, et pour ouvrir l'application.

1. Classe d'appel de méthode

        Le code spécifique est le suivant :

import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.Log;

import java.io.ByteArrayOutputStream;

public class GetApplicationListUtils {
    private Context mContext;
    private static GetApplicationListUtils mGetApplicationListUtils = null;

    public GetApplicationListUtils(Context context) {
        this.mContext = context;
    }


    public static GetApplicationListUtils getInstance(Context context){
        if (mGetApplicationListUtils == null) {
            mGetApplicationListUtils = new GetApplicationListUtils(context);
        }
        return mGetApplicationListUtils;
    }

    //通过包名获取应用图标
    public byte[] getDrawableIconByPackageName(String packageName) {
        Drawable icon = getAppIcon(packageName);
        Bitmap bitmap = drawableToBitmap(icon);
        return bitmapToByte(bitmap);
    }

    //获取应用图标
    private Drawable getAppIcon(String packageName) {
        try {
            PackageManager pm = mContext.getPackageManager();
            ApplicationInfo info = pm.getApplicationInfo(packageName, 0);
            Log.i("GetApplicationListUtils","getAppIcon");
            return info.loadIcon(pm);
        } catch (Exception e) {
            e.printStackTrace();
            Log.i("GetApplicationListUtils","Exception");
            return null;
        }
    }

    //Drawable转Bitmap
    private Bitmap drawableToBitmap(Drawable drawable){
        //取drawable的长宽
        int width = drawable.getIntrinsicWidth();
        int height = drawable.getIntrinsicHeight();
        //取drawable的颜色格式
        Bitmap.Config config = Bitmap.Config.ARGB_8888;
        //创建对应Bitmap
        Bitmap bitmap = Bitmap.createBitmap(width,height,config);
        //建立对应Bitmap的画布
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0,0,width,height);
        //把drawable内容画到画布中
        drawable.draw(canvas);
        Log.i("GetApplicationListUtils","drawableToBitmap");
        return bitmap;
    }

    //Bitmap转Byte
    private byte[] bitmapToByte(Bitmap bitmap){
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
        Log.i("GetApplicationListUtils","bitmapToByte");
        return stream.toByteArray();
    }

    //通过包名获取应用名称
    public String getApplicationNameByPackageName(String packageName) {
        String name;
        PackageManager pm = mContext.getPackageManager();
        try {
            name = pm.getApplicationLabel(pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA)).toString();
        } catch (android.content.pm.PackageManager.NameNotFoundException e) {
            name = "";
        }
        return name;
    }

    //通过包名打开应用
    public void StartApp(String packageName) {
        try {
            Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(packageName);
            mContext.startActivity(intent);
        } catch (Exception exception) {}
    }
}

2. Questions nécessitant une attention particulière

(1) Dessinable en Bitmap

        Après avoir obtenu l'icône de l'application, vous obtiendrez les données au format Drawable, qui doivent être converties en Bitmap, puis à nouveau converties en tableau d'octets pour les appels ultérieurs par Unity.

1) Acquisition de bitmaps

        Android 10.0, c'est-à-dire les versions inférieures au niveau d'API 29, peut utiliser directement ((BitmapDrawable)drawable).getBitmap() pour obtenir le Bitmap ;

        API Android niveau 29 (y compris 29) et supérieur, ((BitmapDrawable)drawable).getBitmap() n'est pas valide, vous devez obtenir Bitmap via Bitmap.createBitmap(width,height,config).

2) Sélection Bitmap.Config

        Pour plus de détails, voir : Bitmap.Config

        Afin d'assurer l'affichage normal des icônes avec des canaux transparents, Bitmap.Config.ARGB_8888 peut être sélectionné.

3) Paramètres du canevas

        Le canevas doit être défini, sinon il y a un problème avec la position d'affichage de l'icône. Autrement dit, le code suivant est indispensable.

//Créer un canevas correspondant au
canevas Bitmap canvas = new Canvas(bitmap);
drawable.setBounds(0,0,width,height);
//Dessiner le contenu dessinable sur le canevas
drawable.draw(canvas);

Deux, appel Unity

1. Placement du package AAR

        Faites glisser et déposez le package AAR directement sur le chemin Actifs-->Plugins-->Android de Unity.

2. Créez un script C# et appelez le package AAR

        Écrivez le contenu suivant pour appeler l'interface de fonction dans le package AAR.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class LauncherManager : MonoBehaviour
{
    public RawImage appIcon;
    public Text appNameText;

    private AndroidJavaObject getApplicationListUtils;

    private void Awake()
    {
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        AndroidJavaClass getApplicationListUtilsClass = new AndroidJavaClass("包名.GetApplicationListUtils");
        getApplicationListUtils = getApplicationListUtilsClass.CallStatic<AndroidJavaObject>("getInstance", currentActivity);
    }

    // Start is called before the first frame update
    void Start()
    {
        //获取应用图标数据
        byte[] drawableBytes = getApplicationListUtils.Call<byte[]>("getDrawableIconByPackageName", "指定应用包名");

        //新建一个Texture2D来加载获得的图像byte[]数据
        Texture2D texture2D = new Texture2D(100, 100);
        texture2D.LoadImage(drawableBytes);

        //在界面上显示获得的应用图标
        appIcon.texture = texture2D;

        //在界面上显示获得的应用名称
        appNameText.text = getApplicationListUtils.Call<string>("getApplicationNameByPackageName", "指定应用包名");
    }

    //打开应用
    public void OpenApplication()
    {
        getApplicationListUtils.Call("StartApp", "指定应用包名");
    }
}

3. Test d'appel

        Créez une RawImage et un texte dans l'éditeur Unity, le premier est utilisé pour afficher l'icône de l'application et le second est utilisé pour afficher le nom de l'application. Et ajoutez un composant Button à RawImage pour appeler la méthode d'ouverture de l'application. 

4. Passez à la plate-forme Android, packez apk, installez et testez

Guess you like

Origin blog.csdn.net/qq_40364278/article/details/132117328