Androidアプリケーションのビルド/バージョン番号を取得するにはどうすればよいですか?


1288

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

私は何かをしなければなりませんかAndroidManifest.xml


2
確かではありませんが、AndroidManifest.xmlファイルを解析することで取得できると思います。
Sunit Kumar Gupta


バージョンコードint versionCode = BuildConfig.VERSION_CODE;を取得し、バージョン名を取得するにはString versionName = BuildConfig.VERSION_NAME;
Lukas

回答:


2041

使用する:

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

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

int verCode = pInfo.versionCode;

52
@Felixでは、コンテキスト外ではgetPackageManager()を呼び出せないため、getApplicationContext()(または渡されたコンテキスト)が必要になる場合があります。
Sver

2
コンテキストを渡すことができない静的メソッド内でこの番号が必要な場合はどうなりますか?私の側の悪いデザイン?
Gubatron 2013

35
そして、することを忘れないでくださいtry... catch..ときgetPackageInfo()
anticafe

4
@Gubatron以下の私の回答では、これらの値を静的に取得できます。
Sam Dozor 2014年

25
アプリケーションのバージョンのみを取得したい場合、これは2つ複雑です。ここでBuildConfig.VERSION_**提案されているように使用する必要があります
TimoBähr

1920

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

178
これは実際には、すべてのコンテキストおよびパッケージマネージャよりもはるかに優れています。ありがとうございます。
superjugy 2014年

16
実際、これはAndroid Studioがリリースされた後の最良のソリューションです!!! 私の側から+1
Dhruvil Patel 14年

15
あまり信頼できません。ほとんどの場合、バージョン名は空の文字列として表示されます。
Binoy Babu 14

20
@BinoyBabu versionNameは、build.gradleファイルでアプリにを指定した場合、空の文字列として表示されることはありません。
Sam Dozor 14

39
あなたは仕事に、このための正しいパッケージをインポートする必要があります:import com.yourapppackage.android.BuildConfig
エリックB.

438

バージョン名だけが必要な場合は、バージョンを少し短くします。

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

81
優秀な。これは、おそらくNameNotFoundExceptionのtry / catchで囲まれているはずです。
IgorGanapolsky

6
+1私はあなたのソリューションを実装しました。ただし、このソリューションは、Igorが言ったように、try and catchに囲まれている必要があります。また、context.methodName()。subMethod()。anotherSubMethod()などを呼び出す代わりに、各メソッド呼び出しを別々の行に置くことをお勧めします(デバッグなど)。 。1行で。したがって、私は以下のより
Michael

1
これは正しい解決策です、ありがとう;)しかし、@ IgorGanapolskyによって提案されているように、try / catchで囲む必要があります:)
andrea.rinaldi '20

2
Gradleを使用している人のために-より簡単な解決策があります。以下の私の答えを参照してください。
Sam Dozor 2014

1
@Erwinus私はこのようなものをキャッチするために一般的な例外を使用するという考えに心から同意しません。より詳細な例外は、発生する可能性のあるエラーに対する開発者の理解を示しています。
IgorGanapolsky

174

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

versionCodeは数値であり、Marketに送信するアプリのすべてのバージョンには、最後のバージョンよりも高い数値が必要です。

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

6
Androidの公式の説明android:versionCodeandroid:versionNameここで見つけることができます: developer.android.com/tools/publishing/...
Jeffro

2
この場合、これはコンテキスト.ieアクティビティ、サービス
.etcです

3
あなたには、いくつかのサンプルコードを貼り付けるとalthougみんなは何を理解することができます....便利なパラメータの意味を説明することであるthis.getPackageName()表し0あなただけの意味についての手掛かりがありません吐く
ラファエル・リマ

Android StudioはversionCodeが廃止予定であると主張しています
Roman Gherta

1
@RomanGhertaこれはAPI 28の時点です。少ないコード(またはこの回答が書かれた8年前)を使用してコードを記述している場合でも、問題はありません。ここでの別の答えは更新されたメソッドです。
Merkidemis

146

GradleとBuildConfigの使用

BuildConfigからVERSION_NAMEを取得する

BuildConfig.VERSION_NAME

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

VERSION_NAMEに空の文字列を返していますか?

空の文字列を取得している場合は、BuildConfig.VERSION_NAME次に進んでください。

GradeビルドファイルにをBuildConfig.VERSION_NAME設定していなかったため、空の文字列を取得し続けましたversionName(ANTからGradleに移行しました)。だから、これはあなたがあなたの設定していることを確認するための手順ですVERSION_NAME 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}"
  }

}

注:これは見事なJake Whartonによるものです。

削除versionNameしてversionCodeからAndroidManifest.xml

そして、以来、あなたは、設定したversionNameversionCodeしてbuild.gradle今ファイル、また、あなたからそれらを削除することができAndroidManifest.xml、彼らが存在する場合、ファイル。


5
アプリケーションプロジェクトで使用されるライブラリではなく、アプリケーションプロジェクトからBuildConfigにアクセスしている限り、これはうまく機能します。それ以外の場合は、アプリケーションではなく、ライブラリプロジェクトのBuildConfigを取得します。
John Cummings

@JohnCummings興味深い...それは考えていませんでした。
Joshua Pinter、2015

まったく動作しませんversionName "1.2"、そしてBuildConfig.VERSION_NAME戻りemptyます。API> 21
Sojtin

フォローアップとして、我々は実際には、静的な整数との静的文字列の賛成でこの方法を使用して停止versionCodeし、versionNameそれぞれ。コードプッシュなどの一部のツールは、build.gradleファイルを解析してバージョン番号を取得しようとし、動的な値を完全に満たすことができないためです。
ジョシュアピンター

@JoshuaPinter PackageManagerは本当に最も安全なオプションです。分割にバージョンコードのオーバーライドを使用する場合、BuildConfig定数は元の(フレーバーではありますが)値を保持します。
Eugen Pechanec

54

これは、scottyab(Xaviによって編集された)のソリューションに基づいたクリーンなソリューションです。メソッドによって提供されていない場合、最初にコンテキストを取得する方法を示します。さらに、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();
}

String myVersionNameでバージョン名を受け取ったので、それをTextViewまたは好きなものに設定できます。

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

NNFEは本当に投げられると思いますか?パッケージマネージャーで実行中のアプリケーションが見つからないのはおかしいでしょう:)
TWiStErRob

私はそれが奇妙であるかもしれないことをあなたとだが、それはこのメソッドのデフォルトの例外だ-を参照してAPIを:それは言いますThrows PackageManager.NameNotFoundException if a package with the given name can not be found on the system.。しかし、そのシナリオは想像できませんでした。
マイケル

38

アプリのバージョンを取得するか、バージョンコードによってAPKを識別するために使用されるコードをビルドします。バージョンコードは、更新、公開などの際に実際のビルド構成を検出するために使用されます。

int versionCode = BuildConfig.VERSION_CODE;

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

String versionName = BuildConfig.VERSION_NAME;

34

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

23

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

ここここから派生。


9
問題はPhoneGapに関するものではありませんでした。あなたの答えは単に人々を混乱させるかもしれません。
likebobby

8
@BobbyJ質問、タイトル、タグのどこにも、質問がネイティブアプリケーションに関するものであることを示していません。これは、私が答えを探していたときにグーグルで出てきたもので、数時間節約できたでしょう。
Sean Hall、

ホール72215に感謝します。私はこれをうれしく思います...あなた自身のバージョン番号を取得する他の方法がない場合はどうですか?できればプラグインは避けたいです。
Magnus Smith、

@MagnusSmith PhoneGap / Cordovaが組み込み関数に追加した場合を除きます。
Sean Hall、

この例では、サードパーティのソリューションを使用してアプリを作成するのがどれほどばかげているかがわかります。自分で最初から作成した場合は、コードを書くための数行でした。
Codebeat

19

Kotlinワンライナー

  val versionCode = BuildConfig.VERSION_CODE
  val versionName = BuildConfig.VERSION_NAME

必ずBuildConfigクラスにインポートしてください


13

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

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" />

xmlでエラーが発生します:シンボル '@ string / versionName'を解決できません
RJB

12

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

基本的に、アプリのバージョン名と、defaultConfigタグの下のアプリレベルのGradleファイル内のバージョンコード:

defaultConfig {  
   versionCode 1  
   versionName "1.0"  
}  

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

次のコードスニペットを使用して、バージョンコードバージョン名をアプリのどこからでも取得できます。

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

1
versionCodeはAPI 28で廃止されました。ドキュメントに記載されているように、代わりにlongVersionCodeを使用してください。developer.android.com/reference/android/content/pm/...
ダン異常な

11

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

9

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

9

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

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

3
より良い方法-BuildConfig.VERSION_CODE
Jaydev

8

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

プログラムで取得する方法はいくつかversionCodeありversionNameます。

  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;

ライブラリプロジェクトで2番目の方法を使用することを除いて、いくつかの詳細があります。新しい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が、よりPackageManagerあなたが受け取るだろう0nullあなたはセットバージョンなかった場合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
    }
}

6

このコードは上記でバラバラに説明されていますが、ここでもすべてが含まれています。「NameNotFoundException」をスローする可能性があるため、try / catchブロックが必要です。

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

これが将来の誰かのために物事を単純化することを願っています。:)


5

アプリケーションの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)

私の限られた英語能力を失礼しますが、これが役に立てば幸いです。


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

    }

  }
}

こんにちは、@ donmj。Androidデバイスに非公式ルートを使用している場合。私がすべきこと、あなたは必要になるでしょう。これが私のアプローチです。
Durul Dalkanat 2015年

助けてくれてありがとう@Durul Dalkanat :)
donmj 2015年

4

これを試してください:

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

3

最初:

import android.content.pm.PackageManager.NameNotFoundException;

そしてこれを使います:

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

1
誰もそのための時間を得られませんでした。
BlaShadow

3
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

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

        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

回答を投稿する前に、他の回答を確認してください。たとえば、コンテキストでgetActivity.getApplicationContextを実行している場合、フラグメント内であれば理解できますが、アクティビティ中であれば、getActivityを呼び出す必要はないと思います
Sahil Manchanda

私の場合、フラグメント用に作成しました。コードはのonCreate内で使用されている
Sapphire91140

3

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

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


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

2

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

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

2020と同様: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

ビルドシステムに便利です。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": {}
    }
]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.