web-dev-qa-db-ja.com

Androidアプリケーションのビルド/バージョン番号を取得する方法

私は自分のAndroidアプリケーションのビルド番号を取得または作成する方法を理解する必要があります。 UIに表示するにはビルド番号が必要です。

AndroidManifest.xmlで何かしなければなりませんか?

1125

つかいます:

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

そしてこれを使ってバージョンコードを取得できます。

int verCode = pInfo.versionCode;
1922
plus-

Gradleプラグイン/ Android Studioを使用している場合は、 バージョン0.7.0以降 、バージョンコードおよびバージョン名はBuildConfigで静的に入手できます。 アプリのパッケージ を必ずインポートしてください。別のBuildConfigはインポートしないでください。

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

Contextオブジェクトは必要ありません。

また、build.gradleではなく、必ずAndroidManifest.xmlファイルにそれらを指定してください。

defaultConfig {
    versionCode 1
    versionName "1.0"
}
1662
Sam Dozor

あなたがちょうどバージョン名が欲しいならば少し短いバージョン。

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

必要な部分は2つあります。Android:versionCode Android:versionName

versionCodeは数値です。マーケットに送信するアプリのすべてのバージョンには、最後の数値よりも大きい数値が必要です。

VersionNameは文字列であり、任意の名前にすることができます。ここで、アプリを "1.0"、 "2.5"、または "2 Alpha EXTREME!"として定義します。または何でも。

例:

コトリン:

val manager = this.packageManager
val info = manager.getPackageInfo(this.packageName, PackageManager.GET_ACTIVITIES)
toast("PackageName = " + info.packageName + "\nVersionCode = "
            + info.versionCode + "\nVersionName = "
            + info.versionName + "\nPermissions = " + info.permissions)

Java:

PackageManager manager = this.getPackageManager();
PackageInfo info = manager.getPackageInfo(this.getPackageName(), PackageManager.GET_ACTIVITIES);
Toast.makeText(this,
     "PackageName = " + info.packageName + "\nVersionCode = "
       + info.versionCode + "\nVersionName = "
       + info.versionName + "\nPermissions = " + info.permissions, Toast.LENGTH_SHORT).show();
152
Merkidemis

GradleとBuildConfigを使う

BuildConfigからVERSION_NAMEを取得する

BuildConfig.VERSION_NAME

うん、それは今とても簡単です。

VERSION_NAMEに空の文字列が返されますか。

あなたがBuildConfig.VERSION_NAMEのために空の文字列を取得しているなら、それから読んでください。

GradeビルドファイルでversionNameを設定していなかったため、BuildConfig.VERSION_NAMEに空の文字列を受け取り続けました(私はANTからGradleに移行しました)。そのため、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}"
  }

}

注:これは見事な Jake Wharton からのものです

AndroidManifest.xmlからversionNameversionCodeを削除する

build.gradleファイルでversionNameversionCodeを設定したので、存在する場合は、それらをAndroidManifest.xmlファイルから削除することもできます。

134
Joshua Pinter
BuildConfig.VERSION_NAME //version name from your build file
BuildConfig.VERSION_CODE //version code from your build file

パッケージマネージャから入手する必要はないと思います

73
M. Usman Khan

これは きれいな解決策 で、(Xaviによって編集された)scottyabの解決策に基づいています。それはあなたのメソッドによって提供されていない場合、それは最初にコンテキストを取得する方法を示しています。さらに、1行に複数のメソッドを呼び出す代わりに複数の行を使用します。あなたのアプリケーションをデバッグしなければならないとき、これはそれをより簡単にします。

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

文字列myVersionNameでバージョン名を受け取ったので、それをTextViewまたはあなたが好きなものに設定することができます。

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

BuildConfigクラスを使用する

String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

build.gradle(アプリ)

 defaultConfig {
    applicationId "com.myapp"
    minSdkVersion 19
    targetSdkVersion 27
    versionCode 17
    versionName "1.0"
   }
27
Velayutham M

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

here および here から派生したものです。

23
Sean Hall

とても簡単な方法は:

private String appVersion = BuildConfig.VERSION_NAME;
22

これは バージョン名 バージョンコード を取得する簡単な方法です。

String version_name=BuildConfig.VERSION_NAME;
int version_code=BuildConfig.VERSION_CODE; 
16
Android Geek

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;
}
12
Tushar patel

あなたがxmlでそれを使いたいならば、あなたのgradleファイルの下の行を加えてください:

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

そして、このようにあなたのXMLにそれを使用します。

<TextView
        Android:gravity="center_horizontal"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:text="@string/versionName" />
9
Irfan Raza

バージョンコードを取得する方法は次のとおりです。

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;
}
9
Gevaria Purva

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

私は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);
        }
    }
}
8
Shubham Gupta

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から入手してください。ただし、libraryでこの値にアクセスすると、このライブラリを使用するアプリケーションのバージョンではなく、ライブラリのバージョンが返されることに注意してください。だから ライブラリではないプロジェクトでだけ使ってください!
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

図書館プロジェクトで2番目の方法を使用することを除いて、いくつかの詳細があります。新しいAndroidグラドルプラグイン(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に値を正しく設定しますが、PackageManager設定にバージョンを設定しなかった場合はnullから0およびdefaultを受け取ります。だからあなたのアプリはデバイス上の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
    }
}
7
mohax

このコードは上記でいくつかの部分について説明しましたが、ここでもすべて含まれています。 "NameNotFoundException"がスローされる可能性があるため、try/catchブロックが必要です。

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

私はこれが道を歩いている誰かのために物事を単純化すると思います。 :)

6
Jeff.H

いいえ、AndroidManifest.xmlでは何もする必要はありません。

基本的に、 app level gradle fileの中の defaultConfig tagの中に、アプリのバージョン名とバージョンコードがあります。

defaultConfig {  
   versionCode 1  
   versionName "1.0"  
}  

注:Playストアにアプリをアップロードする場合は、バージョン名として任意の名前を付けることができますが、このアプリが既にPlayストアにある場合は、バージョンコードは現在のバージョンコードとは異なる必要があります。

次のコードスニペットを使用して、アプリ内の任意の場所から バージョンコード バージョン名 を取得します。

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

ただし、アプリケーションのUIにBuildConfig情報を必要としない人は、これらの情報を使用してCIジョブ設定を設定したい、または私のような他の人もいます。

プロジェクトが正常にビルドされている限り、プロジェクトディレクトリの下に自動的に生成されたファイルBuildConfig.Javaがあります。

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

必要な情報を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)

私の限られた英語力を許してください、しかしこれが役立つことを願っています。

5
JasonChiu

api 28の場合、PackageInfo.versionCodeは推奨されていないので、以下のコードを使用してください。

    Context context = getApplicationContext();
    PackageManager manager = context.getPackageManager();
    try {
        PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0);
        myversionName = info.versionName;
        versionCode = (int) PackageInfoCompat.getLongVersionCode(info);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        myversionName = "Unknown-01";
    }
4
Amir jodat

これを試してください。

try 
{
    device_version =  getPackageManager().getPackageInfo("com.google.Android.gms", 0).versionName;
}
catch (PackageManager.NameNotFoundException e)
{
    e.printStackTrace();
}
4
Heenali Lakhani
 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) {

    }

  }
}
4
Durul Dalkanat
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;
        }
    }
3
Atif Mahmood

最初:

import Android.content.pm.PackageManager.NameNotFoundException;

そしてこれを使う:

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

内部フラグメントの使用例.

        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
3
Sapphire91140

バージョンコードだけを取得してアプリが更新されたかどうかを確認する必要があるため、更新されたものを取得するにはプレイストアを起動する必要がありました。私はこうやった。

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

}

それから、utilクラスを作成して共有設定を使用してバージョンコードを保存しました。

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
     }
   }
2
IP Kaal
  PackageInfo pinfo = null;
    try {
        pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    int versionNumber = pinfo.versionCode;
    String versionName = pinfo.versionName;
2
janardhan
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();
    }
1
Shanmugavel GK

バージョンコードによってapkを識別するために使用されるビルドコードを取得します。バージョンコードは、データベースのアップグレード時、発行時などに実際のビルド構成を検出するために使用されます。

int versionCode = BuildConfig.VERSION_CODE;

バージョン名は、developmentmemtシーケンスの開発者または開発者を支持するために使用されます。必要に応じて任意の種類のバージョン名を追加できます

文字列versionName = BuildConfig.VERSION_NAME;

0
Rohit Patil

Kotlinの例:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.act_signin)

    packageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES).apply {
        findViewById<TextView>(R.id.text_version_name).text = versionName
        findViewById<TextView>(R.id.text_version_code).text =
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) "$longVersionCode" else "$versionCode"
    }

    packageManager.getApplicationInfo(packageName, 0).apply{
        findViewById<TextView>(R.id.text_build_date).text =
            SimpleDateFormat("yy-MM-dd hh:mm").format(Java.io.File(sourceDir).lastModified())
    }
}

感謝しないでください:-)

0

ビルドシステムに役立ちます。apkで生成されるoutput.jsonというファイルがあり、versionNameやversionCodeなど、生成された各APKの情報の配列が含まれます。

例えば

[
    {
        "apkInfo": {
            "baseName": "x86-release",
            "enabled": true,
            "filterName": "x86",
            "fullName": "86Release",
            "outputFile": "x86-release-1.0.apk",
            "splits": [
                {
                    "filterType": "ABI",
                    "value": "x86"
                }
            ],
            "type": "FULL_SPLIT",
            "versionCode": 42,
            "versionName": "1.0"
        },
        "outputType": {
            "type": "APK"
        },
        "path": "app-x86-release-1.0.apk",
        "properties": {}
    }
]
0
Tom

2019年のように:API 28 "versionCode"は非推奨使用できるように"longVersionCode"

Kotlinのサンプルコード

  val manager = context?.packageManager
        val info = manager?.getPackageInfo(
            context?.packageName, 0
        )

        val versionName = info?.versionName
        val versionNumber = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            info?.longVersionCode
        } else {
            info?.versionCode
        }
0
Mayank Sharma