read_logs - write permission android




Come ottenere il numero di build/versione della tua applicazione Android? (18)

Devo capire come ottenere o creare un numero di build per la mia applicazione Android. Ho bisogno del numero di build da visualizzare nell'interfaccia utente.

Devo fare qualcosa con AndroidManifest.xml ?


Utilizzando Gradle e BuildConfig

Ottenere il VERSION_NAME da BuildConfig

BuildConfig.VERSION_NAME

Sì, è così facile ora.

Restituisce una stringa vuota per VERSION_NAME?

Se stai ricevendo una stringa vuota per BuildConfig.VERSION_NAME leggere.

Ho continuato a ottenere una stringa vuota per BuildConfig.VERSION_NAME perché non stavo impostando versionName nel mio file di build Grade (ho migrato da ANT a Gradle). Quindi, ecco le istruzioni per assicurarti di impostare VERSION_NAME tramite 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}"
  }

}

Nota: questo è del magistrale Jake Wharton .

Rimozione di versionName e versionCode da AndroidManifest.xml

E dato che ora hai impostato versionName e versionCode nel file build.gradle , puoi rimuoverli dal tuo file AndroidManifest.xml , se sono presenti.


Ci sono alcuni modi per ottenere versionCode e versionName .

  1. Ottieni la versione da PackageManager . Questo è il modo migliore per la maggior parte dei casi.
try {
    String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
    int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
  1. BuildConfig.java da BuildConfig.java generato. Ma notate che se accedete a questi valori nella libreria restituirà la versione della libreria, non quella dell'app, che utilizza questa libreria. Quindi usa solo in progetti non librerie!
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

Ci sono alcuni dettagli, ad eccezione dell'uso della seconda via nel progetto della biblioteca. Nel nuovo plugin Android Gradle (3.0.0+) sono state rimosse alcune funzionalità . Quindi, per ora, vale a dire l'impostazione di versioni diverse per sapori diversi non funziona correttamente.

Modo errato:

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
}

Il codice sopra imposterà correttamente i valori in BuildConfig , ma da PackageManager riceverai 0 e null se non hai impostato la versione nella configurazione default . Quindi la tua app avrà il codice di versione 0 sul dispositivo.

C'è una soluzione alternativa: imposta la versione per l'output del file apk manualmente:

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

Ecco il metodo per ottenere il codice della versione:

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

Ecco una soluzione pulita , basata sulla soluzione di scottyab (edita da Xavi). Mostra come ottenere il contesto per primo, se non è fornito dal tuo metodo. Inoltre usa più linee invece di chiamare più metodi per riga. Questo rende più facile quando devi eseguire il debug dell'applicazione.

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

Ora che hai ricevuto il nome della versione in String myVersionName , puoi impostarlo su TextView o qualsiasi altra cosa tu voglia ..

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

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

Ho SOLVE questo usando la classe 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);
        }
    }
}

Per gli utenti di xamarin, utilizzare questo codice per ottenere il nome e il codice della versione

1) Nome versione:

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

2) Codice versione:

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

Primo:

import android.content.pm.PackageManager.NameNotFoundException;

e quindi usa questo:

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

Questo codice è stato menzionato sopra in pezzi ma qui è di nuovo tutto incluso. È necessario un blocco try / catch perché potrebbe generare un "NameNotFoundException".

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

Spero che questo semplifica le cose per qualcuno in fondo alla strada. :)


Se stai usando il plugin Gradle / Android Studio, dalla versione 0.7.0 , il codice di versione e il nome della versione sono disponibili staticamente in BuildConfig . Assicurati di importare il pacchetto dell'app e non un altro BuildConfig :

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

Nessun oggetto di contesto necessario!

Assicurati anche di specificarli nel tuo file build.gradle invece di AndroidManifest.xml .

defaultConfig {
    versionCode 1
    versionName "1.0"
}

Se vuoi usarlo su xml, aggiungi sotto la riga del tuo file gradle:

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

E poi usalo sul tuo xml in questo modo:

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

Un modo molto semplice è:

private String appVersion = BuildConfig.VERSION_NAME;

Uso:

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

E puoi ottenere il codice della versione usando questo

int verCode = pInfo.versionCode;

Versione leggermente più breve se si desidera solo il nome della versione.

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

  PackageInfo pinfo = null;
    try {
        pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    int versionNumber = pinfo.versionCode;
    String versionName = pinfo.versionName;

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

    }

  }
}

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






android-manifest