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刪除versionNameversionCode

既然你現在已經在build.gradle文件中設置了versionNameversionCode ,你也可以從你的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
    }
);

herehere派生出來。


如果您只想要版本名稱,稍微縮短版本。

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;
}

有一些方法可以以編程方式獲取versionCodeversionName

  1. PackageManager獲取版本。 這是大多數情況下最好的方法。
try {
    String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
    int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
  1. 從生成的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您將收到0null 。 因此,您的應用將在設備上擁有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;
        }
    }




android-manifest