如何获取Android应用程序的构建版本号?

时间:2011-01-06 14:43:36

标签: android android-emulator android-manifest

我需要弄清楚如何为我的Android应用程序获取或制作内部版本号。我需要在UI中显示内部版本号。

我是否必须对AndroidManifest.xml执行某些操作?

35 个答案:

答案 0 :(得分:1930)

使用:

try {
    PackageInfo pInfo = context.getPackageManager().getPackageInfo(getPackageName(), 0);
    String version = pInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

您可以使用此

获取版本代码
int verCode = pInfo.versionCode;

答案 1 :(得分:1673)

如果您使用的是Gradle插件/ Android Studio as of version 0.7.0,则版本代码和版本名称可在BuildConfig中静态使用。 确保导入应用包,而不是其他BuildConfig

import com.yourpackage.BuildConfig;
...
int versionCode = BuildConfig.VERSION_CODE;
String versionName = BuildConfig.VERSION_NAME;

不需要Context对象!

另请确保在build.gradle文件中指定它们,而不是AndroidManifest.xml

defaultConfig {
    versionCode 1
    versionName "1.0"
}

答案 2 :(得分:419)

如果您只想要版本名称,则稍微缩短版本。

String versionName = context.getPackageManager()
    .getPackageInfo(context.getPackageName(), 0).versionName;

答案 3 :(得分:153)

您需要两个部分: 安卓的versionCode 机器人:的versionName

versionCode是一个数字,您提交给市场的每个应用版本都需要比最后一个更高的数字。

VersionName是一个字符串,可以是您想要的任何字符串。您可以在此处将应用定义为“1.0”或“2.5”或“2 Alpha EXTREME!”或者其他什么。

实施例:

科特林:

val manager = this.packageManager
val info = manager.getPackageInfo(this.packageName, PackageManager.GET_ACTIVITIES)
toast("PackageName = " + info.packageName + "\nVersionCode = "
            + info.versionCode + "\nVersionName = "
            + info.versionName + "\nPermissions = " + info.permissions)

爪哇:

PackageManager manager = this.getPackageManager();
PackageInfo info = manager.getPackageInfo(this.getPackageName(), PackageManager.GET_ACTIVITIES);
Toast.makeText(this,
     "PackageName = " + info.packageName + "\nVersionCode = "
       + info.versionCode + "\nVersionName = "
       + info.versionName + "\nPermissions = " + info.permissions, Toast.LENGTH_SHORT).show();

答案 4 :(得分:134)

使用Gradle和BuildConfig

从BuildConfig获取VERSION_NAME

BuildConfig.VERSION_NAME

是的,现在很容易。

是否为VERSION_NAME返回空字符串?

如果您为BuildConfig.VERSION_NAME获取空字符串,请继续阅读。

我一直为BuildConfig.VERSION_NAME获取一个空字符串,因为我没有在我的成绩构建文件中设置versionName(我从ANT迁移到Gradle)。因此,以下是确保您通过Gradle设置VERSION_NAME的说明。

<强>的build.gradle

def versionMajor = 3
def versionMinor = 0
def versionPatch = 0
def versionBuild = 0 // bump for dogfood builds, public betas, etc.

android {

  defaultConfig {
    versionCode versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild

    versionName "${versionMajor}.${versionMinor}.${versionPatch}"
  }

}

注意:这来自熟练的Jake Wharton

versionName

中删除versionCodeAndroidManifest.xml

由于您现在已在versionName文件中设置versionCodebuild.gradle,因此您也可以将其从AndroidManifest.xml文件中删除,如果它们是那里。

答案 5 :(得分:74)

BuildConfig.VERSION_NAME //version name from your build file
BuildConfig.VERSION_CODE //version code from your build file

我没有看到需要从包管理器中获取它

答案 6 :(得分:52)

这是一个干净的解决方案,基于scottyab的解决方案(由Xavi编辑)。它显示了如何首先获取上下文,如果它不是由您的方法提供的。此外,它使用多行而不是每行调用多个方法。这使您在调试应用程序时更容易。

Context context = getApplicationContext(); // or activity.getApplicationContext()
PackageManager packageManager = context.getPackageManager();
String packageName = context.getPackageName();

String myVersionName = "not available"; // initialize String

try {
    myVersionName = packageManager.getPackageInfo(packageName, 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

现在您已收到字符串myVersionName中的版本名称,您可以将其设置为TextView或任何您喜欢的版本。

// set version name to a TextView
TextView tvVersionName = (TextView) findViewById(R.id.tv_versionName);
tvVersionName.setText(myVersionName);

答案 7 :(得分:27)

Use BuildConfig class

String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

build.gradle(app)

 defaultConfig {
    applicationId "com.myapp"
    minSdkVersion 19
    targetSdkVersion 27
    versionCode 17
    versionName "1.0"
   }

答案 8 :(得分:23)

如果您正在使用PhoneGap,请创建自定义PhoneGap插件:

在应用包中创建一个新类:

package com.Demo; //replace with your package name

import org.json.JSONArray;

import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;

import com.phonegap.api.Plugin;
import com.phonegap.api.PluginResult;
import com.phonegap.api.PluginResult.Status;

public class PackageManagerPlugin extends Plugin {

    public final String ACTION_GET_VERSION_NAME = "GetVersionName";

    @Override
    public PluginResult execute(String action, JSONArray args, String callbackId) {
        PluginResult result = new PluginResult(Status.INVALID_ACTION);
        PackageManager packageManager = this.ctx.getPackageManager();

        if(action.equals(ACTION_GET_VERSION_NAME)) {
            try {
                PackageInfo packageInfo = packageManager.getPackageInfo(
                                              this.ctx.getPackageName(), 0);
                result = new PluginResult(Status.OK, packageInfo.versionName);
            }
            catch (NameNotFoundException nnfe) {
                result = new PluginResult(Status.ERROR, nnfe.getMessage());
            }
        }

        return result;
    }
}

在plugins.xml中,添加以下行:

<plugin name="PackageManagerPlugin" value="com.Demo.PackageManagerPlugin" />

deviceready event中,添加以下代码:

var PackageManagerPlugin = function() {

};
PackageManagerPlugin.prototype.getVersionName = function(successCallback, failureCallback) {
    return PhoneGap.exec(successCallback, failureCallback, 'PackageManagerPlugin', 'GetVersionName', []);
};
PhoneGap.addConstructor(function() {
    PhoneGap.addPlugin('packageManager', new PackageManagerPlugin());
});

然后,您可以通过执行以下操作获取versionName属性:

window.plugins.packageManager.getVersionName(
    function(versionName) {
        //do something with versionName
    },
    function(errorMessage) {
        //do something with errorMessage
    }
);

派生自herehere

答案 9 :(得分:23)

科特林单线纸

val versionCode = BuildConfig.VERSION_CODE
val versionName = BuildConfig.VERSION_NAME

请确保将BuildConfig导入您的班级。

Java单行代码

String versionCode = String.valueOf(BuildConfig.VERSION_CODE);
String versionName = String.valueOf(BuildConfig.VERSION_NAME);

答案 10 :(得分:22)

一种非常简单的方法是:

putExtras(Bundle extras)

答案 11 :(得分:18)

这是获取版本名称版本代码

的简单方法
String version_name=BuildConfig.VERSION_NAME;
int version_code=BuildConfig.VERSION_CODE; 

答案 12 :(得分:12)

对于xamarin用户,请使用此代码获取版本名称和代码

1)版本名称:

public string getVersionName(){
      return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionName;
}

2)版本代码:

public string getVersionCode(){
      return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionCode;
}

答案 13 :(得分:10)

如果要在xml上使用它,请在gradle文件中添加以下行:

applicationVariants.all { variant ->
    variant.resValue "string", "versionName", variant.versionName
}

然后在你的xml上使用它:

<TextView
        android:gravity="center_horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/versionName" />

答案 14 :(得分:9)

始终使用try catch阻止:

String versionName = "Version not found";

try {
    versionName = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
    Log.i(TAG, "Version Name: " + versionName);
} catch (NameNotFoundException e) {
    // TODO Auto-generated catch block
    Log.e(TAG, "Exception Version Name: " + e.getLocalizedMessage());
}

答案 15 :(得分:9)

以下是获取版本代码的方法:

public String getAppVersion() {
    String versionCode = "1.0";
    try {
        versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
    } catch (PackageManager.NameNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return versionCode;
}

答案 16 :(得分:8)

版本名称:BuildConfig.VERSION_NAME 版本代码:BuildConfig.VERSION_CODE

答案 17 :(得分:8)

我通过使用Preference类来解决这个问题。

package com.example.android;

import android.content.Context;
import android.preference.Preference;
import android.util.AttributeSet;

public class VersionPreference extends Preference {
    public VersionPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        String versionName;
        final PackageManager packageManager = context.getPackageManager();
        if (packageManager != null) {
            try {
                PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
                versionName = packageInfo.versionName;
            } catch (PackageManager.NameNotFoundException e) {
                versionName = null;
            }
            setSummary(versionName);
        }
    }
}

答案 18 :(得分:7)

有一些方法可以通过编程方式获得versionCodeversionName

  1. PackageManager获取版本。这是大多数情况下的最佳方式。
  2. try {
        String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
        int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    
    1. 从生成的BuildConfig.java获取。但请注意,如果您将在库中访问此值,它将返回使用此库的库版本,而不是应用程序之一。所以仅在非库项目中使用!
    2. String versionName = BuildConfig.VERSION_NAME;
      int versionCode = BuildConfig.VERSION_CODE;
      

      除了在库项目中使用第二种方式外,还有一些细节。在新的android gradle插件(3.0.0+)中有些functionalities removed。所以,就目前而言,即设置不同版本的不同版本不正确。

      方式不正确:

      applicationVariants.all { variant ->
          println('variantApp: ' + variant.getName())
      
          def versionCode = {SOME_GENERATED_VALUE_IE_TIMESTAMP}
          def versionName = {SOME_GENERATED_VALUE_IE_TIMESTAMP}
      
          variant.mergedFlavor.versionCode = versionCode
          variant.mergedFlavor.versionName = versionName
      }
      

      以上代码会在BuildConfig中正确设置值,但如果您未在{{1}中设置版本,则会从PackageManager收到0null配置。因此,您的应用将在设备上显示default版本代码。

      有一种解决方法 - 手动设置输出0文件的版本:

      apk

答案 19 :(得分:6)

上面已经提到了这段代码,但这里又包含了所有内容。你需要一个try / catch块,因为它可能会抛出一个&#34; NameNotFoundException&#34;。

try {
   String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}

我希望这能为后来的人简化事情。 :)

答案 20 :(得分:6)

否,您无需对AndroidManifest.xml进行任何操作

基本上,您的应用的版本名称和版本代码位于 app level gradle 文件中的 defaultConfig 标记下:

defaultConfig {  
   versionCode 1  
   versionName "1.0"  
}  

注意:当您希望在Play商店中上传应用时,可以使用任何名称作为版本名称,但是如果该应用已经在Play商店中,则该版本代码必须与当前版本代码不同。

只需使用以下代码段即可从应用程序中的任何位置获取版本代码版本名称

try {  
    PackageInfo pInfo =   context.getPackageManager().getPackageInfo(context.getPackageName(), 0);  
    String version = pInfo.versionName;  
    int verCode = pInfo.versionCode;  
} catch (PackageManager.NameNotFoundException e) {  
    e.printStackTrace();  
}  

答案 21 :(得分:5)

不需要应用程序用户界面的BuildConfig信息的人想要使用这些信息来设置CI作业配置或其他人,比如我。

只要您成功构建项目,就会在项目目录下有一个自动生成的文件BuildConfig.java。

{WORKSPACE} /建立/生成/源极/ buildConfig / {调试|释放} / {PACKAGE} /BuildConfig.java

/**
* Automatically generated file. DO NOT MODIFY
*/
package com.XXX.Project;

public final class BuildConfig {
    public static final boolean DEBUG = Boolean.parseBoolean("true");
    public static final String APPLICATION_ID = "com.XXX.Project";
    public static final String BUILD_TYPE = "debug";
    public static final String FLAVOR = "";
    public static final int VERSION_CODE = 1;
    public static final String VERSION_NAME = "1.0.0";
}

通过python脚本或其他工具拆分您需要的信息。这是一个例子:

import subprocess
#find your BuildConfig.java
_BuildConfig = subprocess.check_output('find {WORKSPACE} -name BuildConfig.java', shell=True).rstrip()
#get the version name
_Android_version = subprocess.check_output('grep -n "VERSION_NAME" '+_BuildConfig, shell=True).split('"')[1]
print('Android version :’+_Android_version)

请原谅我有限的英语能力,但希望这有帮助。

答案 22 :(得分:4)

'info'

答案 23 :(得分:4)

对于Api 28,PackageInfo.versionCode已弃用,因此请在下面使用此代码:

    Context context = getApplicationContext();
    PackageManager manager = context.getPackageManager();
    try {
        PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0);
        myversionName = info.versionName;
        versionCode = (int) PackageInfoCompat.getLongVersionCode(info);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        myversionName = "Unknown-01";
    }

答案 24 :(得分:4)

试试这个:

try 
{
    device_version =  getPackageManager().getPackageInfo("com.google.android.gms", 0).versionName;
}
catch (PackageManager.NameNotFoundException e)
{
    e.printStackTrace();
}

答案 25 :(得分:3)

private String GetAppVersion(){
        try {
            PackageInfo _info = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0);
            return _info.versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            return "";
        }
    }

    private int GetVersionCode(){
        try {
            PackageInfo _info = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0);
            return _info.versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            return -1;
        }
    }

答案 26 :(得分:3)

内部片段使用示例。

        import android.content.pm.PackageManager;
        .......

        private String VersionName;
        private String VersionCode;
        .......


        Context context = getActivity().getApplicationContext();

        /*Getting Application Version Name and Code*/
        try
        {

             VersionName = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;

             /*I find usefull to convert vervion code into String, so it's ready for TextViev/server side checks*/ 

             VersionCode = Integer.toString(context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode);
        } catch (PackageManager.NameNotFoundException e)
        {
             e.printStackTrace();
        }

// DO SOMETHING USEFULL WITH THAT

答案 27 :(得分:3)

首先:

import android.content.pm.PackageManager.NameNotFoundException;

然后使用它:

PackageInfo pInfo = null;
try {
     pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
     e.printStackTrace();
            }
String versionName = pInfo.versionName;

答案 28 :(得分:2)

由于我只需要获取版本代码,并检查应用程序是否已更新,如果可以,我必须启动Playstore来获取更新的版本。我是这样的。

public class CheckForUpdate {

public static final String ACTION_APP_VERSION_CHECK="app-version-check";

public static void launchPlayStoreApp(Context context)
{

    final String appPackageName = context.getPackageName(); // getPackageName() from Context or Activity object
    try {
        context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
    } catch (android.content.ActivityNotFoundException anfe) {
        context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
    }

}

public static int getRemoteVersionNumber(Context context)
{
    int versionCode=0;
    try {
        PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
        String version = pInfo.versionName;
        versionCode=pInfo.versionCode;
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    return versionCode;
}

}

然后,我通过创建util类使用共享首选项保存了版本代码。

public class PreferenceUtils {

// this is for version code
private  final String APP_VERSION_CODE = "APP_VERSION_CODE";
private  SharedPreferences sharedPreferencesAppVersionCode;
private SharedPreferences.Editor editorAppVersionCode;
private static Context mContext;

public PreferenceUtils(Context context)
{
    this.mContext=context;
    // this is for app versioncode
    sharedPreferencesAppVersionCode=mContext.getSharedPreferences(APP_VERSION_CODE,MODE_PRIVATE);
    editorAppVersionCode=sharedPreferencesAppVersionCode.edit();
}

public void createAppVersionCode(int versionCode) {

    editorAppVersionCode.putInt(APP_VERSION_CODE, versionCode);
    editorAppVersionCode.apply();
}

public int getAppVersionCode()
{
    return sharedPreferencesAppVersionCode.getInt(APP_VERSION_CODE,0); // as default  version code is 0
     }
   }

答案 29 :(得分:2)

ConcurrentDictionary<SomeClass, string> dict = new ConcurrentDictionary<SomeClass, string>();
//adding some values
var keys = dict.Keys.Where(k => k.Name == "Example");
foreach (var key in keys)
    dict.TryRemove(key, out _);

答案 30 :(得分:2)

Kotlin示例:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.act_signin)

    packageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES).apply {
        findViewById<TextView>(R.id.text_version_name).text = versionName
        findViewById<TextView>(R.id.text_version_code).text =
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) "$longVersionCode" else "$versionCode"
    }

    packageManager.getApplicationInfo(packageName, 0).apply{
        findViewById<TextView>(R.id.text_build_date).text =
            SimpleDateFormat("yy-MM-dd hh:mm").format(java.io.File(sourceDir).lastModified())
    }
}

不用了,谢谢:-)

答案 31 :(得分:1)

获取用于通过其版本代码标识apk的构建代码。版本代码用于在数据库升级,发布等时对实际的构建配置进行脱色。

int versionCode = BuildConfig.VERSION_CODE;

版本名称用于引导developermemtmt序列的开发人员。您可以根据需要添加任何类型的版本名称

String versionName = BuildConfig.VERSION_NAME;

答案 32 :(得分:0)

try {
        PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
        String versionName = packageInfo.versionName;
        int versionCode = packageInfo.versionCode;
        //binding.tvVersionCode.setText("v" + packageInfo.versionName);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }

答案 33 :(得分:0)

对构建系统有用:有一个用您的apk生成的文件名为output.json,其中包含每个生成的APK的信息数组,包括versionName和versionCode。

例如

[
    {
        "apkInfo": {
            "baseName": "x86-release",
            "enabled": true,
            "filterName": "x86",
            "fullName": "86Release",
            "outputFile": "x86-release-1.0.apk",
            "splits": [
                {
                    "filterType": "ABI",
                    "value": "x86"
                }
            ],
            "type": "FULL_SPLIT",
            "versionCode": 42,
            "versionName": "1.0"
        },
        "outputType": {
            "type": "APK"
        },
        "path": "app-x86-release-1.0.apk",
        "properties": {}
    }
]

答案 34 :(得分:0)

与2019年一样:API 28 “版本代码”已弃用,因此我们可以使用“ longVersionCode”

科特林的示例代码

  val manager = context?.packageManager
        val info = manager?.getPackageInfo(
            context?.packageName, 0
        )

        val versionName = info?.versionName
        val versionNumber = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            info?.longVersionCode
        } else {
            info?.versionCode
        }