Unity获取手机app列表《三》安卓端

啊,不想多说什么了,今天下午的任务还没有完成,抽空记录了一下。

获取app列表这块,我们有两种做法1:跟前两篇博客一样跟安卓交互调取原生的方法获得2:利用反射直接在Unity端就可以获取到,不用调取安卓原生。这里我会把两种方法的代码都分享给大家,殊不知期间哥们我汤了多少坑。我会把源码跟工程地址直接贴给大家

一,不用跟安卓交互,unity独立完成获取app列表

就一下这一个方法就可以了,不用做什么配置也不用要添加什么jar,直接复制粘贴调用就可以,方便快捷

  //获取本地app列表
    public static List<string> GetAllApk()
    {
        List<string> apks = new List<string>();
#if UNITY_ANDROID
        try
        {
            AndroidJavaClass up = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = up.GetStatic<AndroidJavaObject>("currentActivity");
            AndroidJavaObject packageManager = currentActivity.Call<AndroidJavaObject>("getPackageManager");
            AndroidJavaObject packageInfos = packageManager.Call<AndroidJavaObject>("getInstalledPackages", 0);
            AndroidJavaObject[] packages = packageInfos.Call<AndroidJavaObject[]>("toArray");
            for (int i = 0; i < packages.Length; i++)
            {
                AndroidJavaObject applicationInfo = packages[i].Get<AndroidJavaObject>("applicationInfo");
                if ((applicationInfo.Get<int>("flags") & applicationInfo.GetStatic<int>("FLAG_SYSTEM")) == 0)// 判断是不是系统应用
                {
                    string packageName = applicationInfo.Get<string>("packageName");
                    AndroidJavaObject applicationLabel = packageManager.Call<AndroidJavaObject>("getApplicationLabel", applicationInfo);
                    string packageLable = applicationLabel.Call<string>("toString");
                    apks.Add(packageLable + "|" + packageName);
                }
            }
        }
        catch (System.Exception e)
        {
            Debug.LogWarning(e);
        }
#endif
        return apks;
    }

二,跟安卓交互调取原生获取app列表

package com.crf.xfd.entrty;

public class NativeAppInfoBean {

    //应用名
    private String appName;
    //应用包名
    private String packageName;
    //是否是系统应用
    private boolean isSystemApp;
    //初次安装时间
    private String firstInstallTime;

    public String getAppName() {
        return appName;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }

    public String getPackageName() {
        return packageName;
    }

    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }

    public boolean isSystemApp() {
        return isSystemApp;
    }

    public void setSystemApp(boolean systemApp) {
        isSystemApp = systemApp;
    }

    public String getFirstInstallTime() {
        return firstInstallTime;
    }

    public void setFirstInstallTime(String firstInstallTime) {
        this.firstInstallTime = firstInstallTime;
    }

    @Override
    public String toString() {
        return "{\"app_name\"" +":\""+appName+"\"}";
               /* "appName='" + appName + '\'' +
                ", packageName='" + packageName + '\'' +
                ", isSystemApp=" + isSystemApp +
                ", firstInstallTime='" + firstInstallTime + '\'' +
                '}';*/
    }
}
package com.crf.xfd.tools;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;

import com.crf.xfd.entrty.NativeAppInfoBean;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class NativeAppUtils {

    /**
     * 返回系统中所有应用信息列表
     **/
    public static List<NativeAppInfoBean> getAllApps(Context context, long lastPostTime) throws Throwable {
        PackageManager packageManager = context.getPackageManager();
        List<NativeAppInfoBean> list = new ArrayList<>();
        NativeAppInfoBean myAppInfo;
        //获取到所有安装了的应用程序的信息,包括那些卸载了的,但没有清除数据的应用程序
        List<PackageInfo> packageInfos = packageManager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
        for (PackageInfo info : packageInfos) {
            myAppInfo = new NativeAppInfoBean();
            String packageName = info.packageName;
            SimpleDateFormat sfd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            //初次安装时间
            myAppInfo.setFirstInstallTime(sfd.format(new Date(info.firstInstallTime)));
            ApplicationInfo appInfo = info.applicationInfo;
            //程序名
            String appName = appInfo.loadLabel(packageManager).toString();
            myAppInfo.setPackageName(packageName);
            myAppInfo.setAppName(appName);
            if (filterApp(appInfo)) {
                myAppInfo.setSystemApp(false);
            } else {
                myAppInfo.setSystemApp(true);
            }
            if (lastPostTime == 0) {
                list.add(myAppInfo);
            } else if (info.firstInstallTime > lastPostTime) {
                list.add(myAppInfo);
            }
        }
        return list;
    }

    /**
     * 判断是不是系统应用
     */
    public static boolean filterApp(ApplicationInfo info) {
        if ((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
            return true;
        } else if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
            return true;
        }
        return false;
    }
}




我会把源码跟工程地址直接贴给大家

安卓端工程代码:https://download.csdn.net/download/qq_37310110/10471920

Unity端工程代码:https://download.csdn.net/download/qq_37310110/10471930

二合一最新优化更新简单易懂版本:https://download.csdn.net/download/qq_37310110/10472555

之后还会有接入高德gpsSDK的记录 请期待

猜你喜欢

转载自blog.csdn.net/qq_37310110/article/details/80653141