permission - manifest android name
如何獲取Android應用程序的構建版本號? (16)
使用Gradle和BuildConfig
從BuildConfig獲取VERSION_NAME
BuildConfig.VERSION_NAME
是的,現在就這麼簡單。
它是否為VERSION_NAME返回空字符串?
如果您獲取BuildConfig.VERSION_NAME
的空字符串,請繼續閱讀。
我不斷收到BuildConfig.VERSION_NAME
的空字符串,因為我沒有在我的成績構建文件(我從ANT遷移到Gradle)中設置versionName
。 因此,這裡有確保您通過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}"
}
}
注意:這來自傑出的沃頓商學院 。
從AndroidManifest.xml
刪除versionName
和versionCode
既然你現在已經在build.gradle
文件中設置了versionName
和versionCode
,你也可以從你的AndroidManifest.xml
文件中刪除它們,如果它們在那裡的話。
我需要弄清楚如何為我的Android應用程序獲取或創建內部版本號。 我需要在UI中顯示內部版本號。
我必須使用AndroidManifest.xml
做些什麼嗎?
一個非常簡單的方法是:
private String appVersion = BuildConfig.VERSION_NAME;
使用:
try {
PackageInfo pInfo = this.getPackageManager().getPackageInfo(getPackageName(), 0);
String version = pInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
你可以通過使用這個獲得版本代碼
int verCode = pInfo.versionCode;
內部片段使用示例。
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
如果您使用的是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事件中 ,添加以下代碼:
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
}
);
如果您只想要版本名稱,稍微縮短版本。
String versionName = context.getPackageManager()
.getPackageInfo(context.getPackageName(), 0).versionName;
始終使用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());
}
對於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;
}
有一些方法可以以編程方式獲取versionCode
和versionName
。
- 從
PackageManager
獲取版本。 這是大多數情況下最好的方法。
try {
String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
- 從生成的
BuildConfig.java
獲取它。 但請注意,如果您在庫中訪問此值,它將返回使用此庫的庫版本,而不是應用程序。 所以只能用在非庫項目中!
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;
有一些細節,除了在圖書館項目中使用第二種方式。 在新的android gradle插件(3.0.0+)中刪除了一些功能 。 所以,現在,即為不同的口味設置不同的版本,不能正確工作。
不正確的方法:
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
正確設置值,但如果您未在default
配置中設置版本,則從PackageManager
您將收到0
和null
。 因此,您的應用將在設備上擁有0
版本代碼。
有一個解決方法 - 手動設置輸出apk
文件的版本:
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
}
}
有些人不需要應用程序UI的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)
請原諒我有限的英語能力,但希望這有助於。
第一:
import android.content.pm.PackageManager.NameNotFoundException;
然後使用這個:
PackageInfo pInfo = null;
try {
pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
String versionName = pInfo.versionName;
試試這個:
try
{
device_version = getPackageManager().getPackageInfo("com.google.android.gms", 0).versionName;
}
catch (PackageManager.NameNotFoundException e)
{
e.printStackTrace();
}
這段代碼在上面提到過,但這裡又包含了所有代碼。 你需要一個try / catch塊,因為它可能會拋出一個“NameNotFoundException”。
try {
String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}
我希望這可以簡化一些路上的人的事情。 :)
PackageInfo pinfo = null;
try {
pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
int versionNumber = pinfo.versionCode;
String versionName = pinfo.versionName;
BuildConfig.VERSION_NAME //version name from your build file
BuildConfig.VERSION_CODE //version code from your build file
我沒有看到需要從包管理器中獲取它
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;
}
}