Wie erhalte ich die Build- / Versionsnummer Ihrer Android-Anwendung?


Ich muss herausfinden, wie man eine Build-Nummer für meine Android-Anwendung erhält oder erstellt. Ich brauche die Build-Nummer, um sie in der Benutzeroberfläche anzuzeigen.

Muss ich etwas mit AndroidManifest.xml ?



Answers


Benutzen:

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

Und Sie können den Versionscode erhalten, indem Sie diesen

int verCode = pInfo.versionCode;



Wenn Sie das Gradle-Plugin / Android Studio verwenden ( ab Version 0.7.0) , sind Versionscode und Versionsname in BuildConfig statisch BuildConfig . BuildConfig Sie sicher, dass Sie das Paket Ihrer App und nicht ein anderes BuildConfig :

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

Kein Kontextobjekt benötigt!

build.gradle Sie build.gradle sicher, dass Sie sie in Ihrer build.gradle Datei anstelle von AndroidManifest.xml .

defaultConfig {
    versionCode 1
    versionName "1.0"
}



Etwas kürzere Version, wenn Sie nur den Versionsnamen wünschen.

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



Gradle und BuildConfig verwenden

Abrufen der VERSION_NAME von BuildConfig

BuildConfig.VERSION_NAME

Ja, das ist jetzt so einfach.

Gibt es einen leeren String für VERSION_NAME zurück?

Wenn Sie eine leere Zeichenfolge für BuildConfig.VERSION_NAME lesen Sie weiter.

Ich habe immer eine leere Zeichenfolge für BuildConfig.VERSION_NAME weil ich den versionName in meiner Grade-Build-Datei (von ANT auf Gradle migriert) gesetzt habe. Hier finden Sie Anweisungen, um sicherzustellen, dass Sie VERSION_NAME über 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}"
  }

}

Anmerkung: Dies ist von dem meisterhaften Jake Wharton .

Entfernen von versionName und AndroidManifest.xml aus AndroidManifest.xml

Und da Sie jetzt versionName und versionName in der build.gradle Datei festgelegt haben, können Sie diese auch aus Ihrer AndroidManifest.xml Datei entfernen, sofern sie vorhanden sind.




Es gibt zwei Teile, die Sie benötigen: android: versionCode android: versionName

versionCode ist eine Nummer, und jede Version der App, die Sie an den Market senden, muss eine höhere Nummer haben als die letzte.

VersionName ist eine Zeichenfolge und kann beliebig sein. Hier definieren Sie Ihre App als "1.0" oder "2.5" oder "2 Alpha EXTREME!" oder Wasauchimmer.

Beispiel:

Um im Code darauf zuzugreifen, mache etwas wie:

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();



Hier ist eine saubere Lösung , basierend auf der Lösung von scottyab (herausgegeben von Xavi). Es zeigt, wie Sie den Kontext zuerst erhalten, wenn er nicht von Ihrer Methode bereitgestellt wird. Außerdem verwendet es mehrere Zeilen, anstatt mehrere Methoden pro Zeile aufzurufen. Das macht es einfacher, wenn Sie Ihre Anwendung debuggen müssen.

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

Nun, da Sie den Versionsnamen im String myVersionName , können Sie ihn auf einen TextView oder wie auch immer Sie wollen einstellen.

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



Wenn Sie PhoneGap verwenden, erstellen Sie ein benutzerdefiniertes PhoneGap-Plugin:

Erstellen Sie eine neue Klasse im Paket Ihrer App:

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

Fügen Sie in der Datei plugins.xml die folgende Zeile hinzu:

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

Fügen Sie in Ihrem Deviceready-Ereignis den folgenden Code hinzu:

var PackageManagerPlugin = function() {

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

Dann können Sie das Attribut versionName erhalten, indem Sie Folgendes tun:

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

Abgeleitet von hier und hier .




Ein sehr einfacher Weg ist:

private String appVersion = BuildConfig.VERSION_NAME;



Mach es immer mit 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());
}



Hier ist die Methode zum Abrufen des Versionscodes:

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



Ich habe dies mit der Preference-Klasse gelöst.

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



Verwenden Sie für xamarin-Benutzer diesen Code, um Versionsname und Code zu erhalten

1) Versionsname:

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

2) Versionscode:

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



Wenn Sie es auf xml verwenden möchten, fügen Sie die folgende Zeile in Ihrer Datei hinzu:

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

Und dann verwenden Sie es auf Ihrem xml wie folgt:

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



Jemand, der BuildConfig-Informationen für die Benutzerschnittstelle der Anwendung nicht benötigt, möchte diese Informationen jedoch zum Einstellen einer CI-Jobkonfiguration oder anderer, wie mir, verwenden.

Es gibt eine automatisch generierte Datei, BuildConfig.java, in Ihrem Projektverzeichnis, solange Sie Ihr Projekt erfolgreich erstellen.

{WORKSPACE} / build / generiert / source / buildConfig / {debug | release} / {PAKET} /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";
}

Teilen Sie Informationen, die Sie von Python-Skript oder anderen Tools benötigen. Hier ist ein Beispiel:

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)

Bitte entschuldigen Sie meine begrenzten Englischkenntnisse, aber ich hoffe, das hilft.




Dieser Code wurde oben in Stücken erwähnt, aber hier ist es wieder alles enthalten. Sie benötigen einen try / catch-Block, weil er möglicherweise eine "NameNotFoundException" auslöst.

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

Ich hoffe, das vereinfacht die Dinge für jemanden auf der Straße. :)




 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) {

    }

  }
}



Zuerst:

import android.content.pm.PackageManager.NameNotFoundException;

und dann verwende das:

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



Probier diese:

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



Beispiel für die Verwendung von Fragmenten

        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



Es gibt einige Möglichkeiten, programmgesteuert versionName und versionName .

  1. Holen Sie sich die Version von PackageManager . Dies ist der beste Weg für die meisten Fälle.
try {
    String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
    int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
  1. Holen Sie es von der generierten BuildConfig.java . Beachten Sie jedoch, dass wenn Sie auf diese Werte in der Bibliothek zugreifen, die Bibliotheksversion zurückgegeben wird, nicht die App-Version, die diese Bibliothek verwendet. Also nur in Nicht-Bibliotheksprojekten verwenden!
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

Es gibt einige Details, außer der Verwendung des zweiten Weges im Bibliotheksprojekt. Im neuen Android-Plugin (3.0.0+) wurden einige Funktionalitäten entfernt . So, für jetzt, dh Einstellung der verschiedenen Version für verschiedene Aromen funktioniert nicht richtig.

Falscher Weg:

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
}

Der obige Code setzt die Werte in BuildConfig korrekt, aber von PackageManager erhalten Sie 0 und null wenn Sie die Version nicht in der default . Ihre App hat also 0 Versionscode auf dem Gerät.

Es gibt eine Problemumgehung - Version manuell für Ausgabe- apk Datei festlegen:

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