Android 获取APK基本信息与常用方法

只是因为常用到的方法,所以写出来记录一下.供不清楚的人看看,试试.

知识整理

1、PackageManager包管理类

获取设备上的安装的应用程序包,一般通过getPackageManager();获取对象。

常用方法:

(1)、public abstract PackageInfo getPackageInfo(String packageName, int flags)根据包名获取对应的PackageInfo,注意,此处的flags标签:

GET_ACTIVITIES

GET_GIDS

GET_CONFIGURATIONS

GET_INSTRUMENTATION

GET_PERMISSIONS

GET_PROVIDERS

GET_RECEIVERS

GET_SERVICES

GET_SIGNATURES

GET_UNINSTALLED_PACKAGES

(2)、public abstract int[] getPackageGids(String packageName),根据包名获取group-ids

(3)、public abstract PermissionInfo getPermissionInfo(String name, int flags),根据包名和指定的flags获取指定的授权信息

(4)、public abstract List getAllPermissionGroups(int flags);获取所以PermissGroup集合

(5)、public abstract PermissionGroupInfo getPermissionGroupInfo(String name, int flags)根据指定的Group名称获取PermissionGroupInfo对象。

(6)、public abstract ApplicationInfo getApplicationInfo(String packageName, int flags),根据指定的包名获取ApplicationInfo信息。

(7)、public abstract ActivityInfo getActivityInfo(ComponentName component, int flags),根据指定的组件,获取ActivityInfo信息

(8)、public abstract ServiceInfo getServiceInfo(ComponentName component, int flags),根据指定组件获取ServiceInfo

(9)、public abstract ProviderInfo getProviderInfo(ComponentName component, int flags),根据指定组件名称获取ProviderInfo信息

(10)、public abstract List getInstalledPackages(int flags);获取所有安装的PackagInfo信息

(11)、public abstract List getPackagesHoldingPermissions( String[] permissions, int flags);获取具有特定权限的PackagInfo

(12)、public abstract List getInstalledApplications(int flags);获取安装的ApplicationInfo信息

(13)、public abstract boolean addPermission(PermissionInfo info);添加权限

(14)、public abstract void removePermission(String name);移除权限

2、PackageInfo用于描述mainfest中所有描述信息。

常见字段:

(1)、public String packageName;包名

(2)、public String[] splitNames;

(3)、public int versionCode;版本号       (4)、public String versionName;版本名称

(5)、public ApplicationInfo applicationInfo;

(6)、public long firstInstallTime;第一次安装时间

(7)、public long lastUpdateTime;上次更新时间

(8)、public ActivityInfo[] activities;所有的Activity信息

(9)、public ActivityInfo[] receivers; 所有的广播接收者

(10)、public ServiceInfo[] services;所有的服务信息

(11)、public ProviderInfo[] providers;获取ContentProvide
(12)、public PermissionInfo[] permissions;所有的权限信息

2、ApplicationInfo描述应用程序的基本信息,可以通过getApplicationInfo()方法获取该对象。

常见字段:

(1)、public String taskAffinity;

(2)、public String permission;

(3)、public String processName;

(4)、public String className;

(5)、public int descriptionRes;

(6)、public static final int FLAG_SYSTEM = 1«0;系统应用

(7)、public static final int FLAG_EXTERNAL_STORAGE = 1«18;安装在外部存储卡

(8)、 public static final int FLAG_LARGE_HEAP = 1«20;支持大内存

其它诸如ActivityInfo、ServiceInfo都类似,他们都是继承自ComponentInfo类,唯一可以需要注意的就是各个类中的FLAG标签的含义,Flag比较多,需要花较多时间记忆。

方法示例

一、获取APK图标

  /**
     * 获取APK图标
     * @param context 上下文
     * @param apkPath 路径
     * @return 图标Drawable
     */
    public static Drawable getApkIcon(Context context, String apkPath) {
    //PackageManager包管理类   
        PackageManager pm = context.getPackageManager();
        //PackageInfo用于描述mainfest中所有描述信息。 
        PackageInfo info = pm.getPackageArchiveInfo(apkPath,
                PackageManager.GET_ACTIVITIES);
        if (info != null) {
            ApplicationInfo appInfo = info.applicationInfo;
            appInfo.sourceDir = apkPath;
            appInfo.publicSourceDir = apkPath;
            try {
                return appInfo.loadIcon(pm);
            } catch (OutOfMemoryError e) {
                Log.e("ApkIconLoader", e.toString());
            }
        }
        return null;
    }

二、获取APK名称

String label = appInfo.loadLabel(mPackManager).toString();  

三、获取APK包名

String packageName = appInfo.packageName;  

四、获取APK版本号

 String version = info.versionName==null?"0":info.versionName;

五、推断APK是否安装

 /**
     * 推断APK是否安装
     * @param packagename 包名
     * @return true 安装 false 未安装
     */
    private boolean isApkInstalled(String packagename)
    {
        PackageManager localPackageManager = getPackageManager();
        try
        {
            PackageInfo localPackageInfo = localPackageManager.getPackageInfo(packagename, PackageManager.GET_UNINSTALLED_PACKAGES);
            return true;
        }
        catch (PackageManager.NameNotFoundException localNameNotFoundException)
        {
            return false;
        }

    }

六、安装APK

/**
     * 安装APK 
     * @param context 上下文
     * @param file APK路径
     */
    //安装
    public static void installApkFile(Context context, File file) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        //兼容7.0
        if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri contentUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", file);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
        if ( context.getPackageManager().queryIntentActivities(intent, 0).size() > 0 ) {
            context.startActivity(intent);
        }
    }

七、打开APK

 /**
     * 打开APK
     * @param mContext 上下文
     * @param packagename 包名
     */
    private void openAPK(Context mContext,String packagename)
    {
        PackageManager packageManager = mContext.getPackageManager();
        Intent intent=new Intent();
        intent =packageManager.getLaunchIntentForPackage(packagename);
        mContext.startActivity(intent);
    }

8、卸载

    /**
     * 卸载
     * @param context 上下文
     * @param packageName 包名
     */
    public static void delete(Context context, String packageName) {
        Uri uri = Uri.fromParts("package", packageName, null);
        Intent intent = new Intent(Intent.ACTION_DELETE, uri);
        context.startActivity(intent);
    }