I need to figure out how to get or make a build number for my Android application. I need the build number to display in the UI.
Do I have to do something with AndroidManifest.xml
?
I need to figure out how to get or make a build number for my Android application. I need the build number to display in the UI.
Do I have to do something with AndroidManifest.xml
?
Use:
try {
PackageInfo pInfo = context.getPackageManager().getPackageInfo(getPackageName(), 0);
String version = pInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
And you can get the version code by using this
int verCode = pInfo.versionCode;
If you\'re using the Gradle plugin/Android Studio, as of version 0.7.0, version code and version name are available statically in BuildConfig
. Make sure you import your app\'s package, and not another BuildConfig
:
import com.yourpackage.BuildConfig;
...
int versionCode = BuildConfig.VERSION_CODE;
String versionName = BuildConfig.VERSION_NAME;
No Context object needed!
Also make sure to specify them in your build.gradle
file instead of the AndroidManifest.xml
.
defaultConfig {
versionCode 1
versionName \"1.0\"
}
Slightly shorter version if you just want the version name.
String versionName = context.getPackageManager()
.getPackageInfo(context.getPackageName(), 0).versionName;
There are two parts you need: android:versionCode android:versionName
versionCode is a number, and every version of the app you submit to the Market needs to have a higher number then the last.
VersionName is a string, and can be anything you want it to be. This is where you define your app as \"1.0\" or \"2.5\" or \"2 Alpha EXTREME!\" or whatever.
Example:
To access it in code, do something like:
PackageManager manager = this.getPackageManager();
PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0);
Toast.makeText(this,
\"PackageName = \" + info.packageName + \"\\nVersionCode = \"
+ info.versionCode + \"\\nVersionName = \"
+ info.versionName + \"\\nPermissions = \" + info.permissions, Toast.LENGTH_SHORT).show();
BuildConfig.VERSION_NAME
Yep, it\'s that easy now.
If you\'re getting a empty string for BuildConfig.VERSION_NAME
then read on.
I kept getting an empty string for BuildConfig.VERSION_NAME
because I wasn\'t setting the versionName
in my Grade build file (I migrated from ANT to Gradle). So, here are instructions for ensuring you\'re setting your VERSION_NAME
via Gradle.
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}\"
}
}
Note: This is from the masterful Jake Wharton.
versionName
and versionCode
from AndroidManifest.xml
And since you\'ve set the versionName
and versionCode
in the build.gradle
file now, you can also remove them from your AndroidManifest.xml
file, if they are there.
BuildConfig.VERSION_NAME //version name from your build file
BuildConfig.VERSION_CODE //version code from your build file
I don\'t see the need to get it from package manager
Here is a clean solution, based on the solution of scottyab (edited by Xavi). It shows how to get the context first, if it\'s not provided by your method. Furthermore it uses multiple lines instead of calling multiple methods per line. This makes it easier when you have to debug your application.
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();
}
Now that you received the version name in the String myVersionName
, you can set it to a TextView or whatever you like..
// set version name to a TextView
TextView tvVersionName = (TextView) findViewById(R.id.tv_versionName);
tvVersionName.setText(myVersionName);
If you\'re using PhoneGap, then create a custom PhoneGap plugin:
Create a new class in your app\'s package:
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;
}
}
In the plugins.xml, add the following line:
<plugin name=\"PackageManagerPlugin\" value=\"com.Demo.PackageManagerPlugin\" />
In your deviceready event, add the following code:
var PackageManagerPlugin = function() {
};
PackageManagerPlugin.prototype.getVersionName = function(successCallback, failureCallback) {
return PhoneGap.exec(successCallback, failureCallback, \'PackageManagerPlugin\', \'GetVersionName\', []);
};
PhoneGap.addConstructor(function() {
PhoneGap.addPlugin(\'packageManager\', new PackageManagerPlugin());
});
Then, you can get the versionName attribute by doing:
window.plugins.packageManager.getVersionName(
function(versionName) {
//do something with versionName
},
function(errorMessage) {
//do something with errorMessage
}
);
Derived from here and here.
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\"
}
A very simple way is :
private String appVersion = BuildConfig.VERSION_NAME;
For xamarin users, use this code to get version name and code
1) Version Name:
public string getVersionName(){
return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionName;
}
2) Version Code:
public string getVersionCode(){
return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionCode;
}
Always do it with try catch
block:
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());
}
Here is the method for getting the version code:
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;
}
I have SOLVE this by using Preference class.
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);
}
}
}
If you want to use it on xml then add below line on your gradle file:
applicationVariants.all { variant ->
variant.resValue \"string\", \"versionName\", variant.versionName
}
And then use it on your xml like this:
<TextView
android:gravity=\"center_horizontal\"
android:layout_width=\"match_parent\"
android:layout_height=\"wrap_content\"
android:text=\"@string/versionName\" />
There are some ways to get versionCode
and versionName
programmatically.
PackageManager
. This is the best way for most cases.try {
String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
BuildConfig.java
. But notice, that if you\'ll access this values in library it will return library version, not apps one, that uses this library. So use only in non-library projects!String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;
There are some details, except of using second way in library project. In new android gradle plugin (3.0.0+) some functionalities removed. So, for now, i.e. setting different version for different flavors not working correct.
Incorrect way:
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
}
Code above will correctly set values in BuildConfig
, but from PackageManager
you\'ll receive 0
and null
if you didn\'t set version in default
configuration. So your app will have 0
version code on device.
There is a workaround - set version for output apk
file manually:
applicationVariants.all { variant ->
println(\'variantApp: \' + variant.getName())
def versionCode = {SOME_GENERATED_VALUE_IE_TIMESTAMP}
def versionName = {SOME_GENERATED_VALUE_IE_TIMESTAMP}
variant.outputs.all { output ->
output.versionCodeOverride = versionCode
output.versionNameOverride = versionName
}
}
Someone who does’t need BuildConfig info for application\'s UI however wants to use these info for setting a CI job configuration or others, like me.
There is a automatically generated file, BuildConfig.java, under your project directory as long as you build your project successfully.
{WORKSPACE}/build/generated/source/buildConfig/{debug|release}/{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\";
}
Split information you need by python script or other tools. Here’s an example:
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)
Please excuse my limited English ability, but hope this helps.
This code was mentioned above in pieces but here it is again all included. You need a try/catch block because it may throw a \"NameNotFoundException\".
try {
String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}
I hope this simplifies things for someone down the road. :)
package com.sqisland.android.versionview;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textViewversionName = (TextView) findViewById(R.id.text);
try {
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
textViewversionName.setText(packageInfo.versionName);
}
catch (PackageManager.NameNotFoundException e) {
}
}
}
First:
import android.content.pm.PackageManager.NameNotFoundException;
and then use this:
PackageInfo pInfo = null;
try {
pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
String versionName = pInfo.versionName;
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;
}
}
try this one:
try
{
device_version = getPackageManager().getPackageInfo(\"com.google.android.gms\", 0).versionName;
}
catch (PackageManager.NameNotFoundException e)
{
e.printStackTrace();
}
Example for inside Fragment usage.
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
In Activity file
final TextView text_1 = (TextView) findViewById(R.id.text_1);
String version= BuildConfig.VERSION_NAME;
int code = BuildConfig.VERSION_CODE;
text_1.setText(\"version Name : \"+version+ \"Version Code : \"+code);
I hope it will help you...!
PackageInfo pinfo = null;
try {
pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
int versionNumber = pinfo.versionCode;
String versionName = pinfo.versionName;
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();
}
As I had to get only version code and check whether app is updated or not, if yes, I had to launch the playstore to get updated one. I did this way.
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;
}
}
Then I saved version code using shared preference by creating an util class.
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
}
}
Here is the simple way to get version name and version code
String version_name=BuildConfig.VERSION_NAME;
int version_code=BuildConfig.VERSION_CODE;