Android 获取当前app的版本号和版本名称

QuibblerQuibbler 2020-01-08 约 11 分钟 1648 次阅读

apk打包之前根据自己的需要,进行版本号、版本名称设置。android studio 设置是于build.gradle文件的中设置。

defaultConfig 
        ......
        versionCode 1
        versionName "1.0"
        ......
    }

在Activity中可以直接调用getPackageManager()方法来获取PackageManager对象,这是Context的子类ContextWrapper中的getPackageManager()方法。

源码:

@Override
    public PackageManager getPackageManager() {
        return mBase.getPackageManager();
    }

PackageManager类中的getPackageInfo(String packageName, int flags)方法可以获取指定包名应用的PackageInfo信息。

第一个参数是APP的包名,如果不存在则会抛出NameNotFoundException异常。举个例子,获取QQ的Version信息:

PackageInfo packageInfo = packageManager.getPackageInfo("com.tencent.mobileqq", 0);

第二个参数是falg标志,可以按需返回想要获取的信息,可以多个标志位或操作|。如果全部返回那么可能信息量太大Binder传递不了会奔溃。部分标志位如下,更多的可以查看源码:

/**
     * {@link PackageInfo} flag: return information about
     * activities in the package in {@link PackageInfo#activities}.
     */
    public static final int GET_ACTIVITIES              = 0x00000001;
    /**
     * {@link PackageInfo} flag: return information about
     * intent receivers in the package in
     * {@link PackageInfo#receivers}.
     */
    public static final int GET_RECEIVERS               = 0x00000002;
    /**
     * {@link PackageInfo} flag: return information about
     * services in the package in {@link PackageInfo#services}.
     */
    public static final int GET_SERVICES                = 0x00000004;
    /**
     * {@link PackageInfo} flag: return information about
     * content providers in the package in
     * {@link PackageInfo#providers}.
     */
    public static final int GET_PROVIDERS               = 0x00000008;

举个例子:

try {
        PackageInfo packageInfo = packageManager.getPackageInfo(this.getPackageName(), 
                                        PackageManager.GET_ACTIVITIES|GET_RECEIVERS );
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }

注:有没有发现PackageManager似曾相识,checkSelfPermission申请权限的时候返回的状态码PERMISSION_GRANTED和PERMISSION_DENIED也定义在这个类中:

/**
     * Permission check result: this is returned by {@link #checkPermission}
     * if the permission has been granted to the given package.
     */
    public static final int PERMISSION_GRANTED = 0;
    /**
     * Permission check result: this is returned by {@link #checkPermission}
     * if the permission has not been granted to the given package.
     */
    public static final int PERMISSION_DENIED = -1;

PackageInfo类中有很多应用的信息可以直接访问:

public class PackageInfo implements Parcelable {
    /**
     * The name of this package.  From the <manifest> tag's "name"
     * attribute.
     */
    public String packageName;
    /**
     * The names of any installed split APKs for this package.
     */
    public String[] splitNames;
    @Deprecated
    public int versionCode;
    public int versionCodeMajor;
    ... ...
}

附:获取应用版本号和版本名的工具方法

public class APKVersionCodeUtils {
    /**
     * 获取当前本地apk的版本
     *
     * @param mContext
     * @return
     */
    public static int getVersionCode(Context mContext) {
        int versionCode = 0;
        try {
            //获取软件版本号,对应build.gradle下的versionCode
            versionCode = mContext.getPackageManager().
                    getPackageInfo(mContext.getPackageName(), 0).versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return versionCode;
    }
 
    /**
     * 获取版本号名称
     *
     * @param context 上下文
     * @return
     */
    public static String getVerName(Context context) {
        String verName = "";
        try {
            verName = context.getPackageManager().
                    getPackageInfo(context.getPackageName(), 0).versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return verName;
    }
}

参考博客:

        《Android中获取应用程序(包)的信息-----PackageManager的使用》

        《Android获取应用程序信息——PackageManager的基本使用》

        《有坑!Android新版QQ获取packageInfo引发异常崩溃》

        《PackageManager.getInstalledPackages之flags浅谈》


相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w