私は自分のAndroidアプリケーションのビルド番号を取得または作成する方法を理解する必要があります。 UIに表示するにはビルド番号が必要です。
AndroidManifest.xml
で何かしなければなりませんか?
つかいます:
try {
PackageInfo pInfo = context.getPackageManager().getPackageInfo(getPackageName(), 0);
String version = pInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
そしてこれを使ってバージョンコードを取得できます。
int verCode = pInfo.versionCode;
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"
}
あなたがちょうどバージョン名が欲しいならば少し短いバージョン。
String versionName = context.getPackageManager()
.getPackageInfo(context.getPackageName(), 0).versionName;
必要な部分は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();
BuildConfig.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
からversionName
とversionCode
を削除するbuild.gradle
ファイルでversionName
とversionCode
を設定したので、存在する場合は、それらをAndroidManifest.xml
ファイルから削除することもできます。
BuildConfig.VERSION_NAME //version name from your build file
BuildConfig.VERSION_CODE //version code from your build file
パッケージマネージャから入手する必要はないと思います
これは きれいな解決策 で、(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);
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"
}
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
}
);
とても簡単な方法は:
private String appVersion = BuildConfig.VERSION_NAME;
これは バージョン名 と バージョンコード を取得する簡単な方法です。
String version_name=BuildConfig.VERSION_NAME;
int version_code=BuildConfig.VERSION_CODE;
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;
}
あなたが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" />
バージョンコードを取得する方法は次のとおりです。
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;
}
常に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);
}
}
}
versionCode
とversionName
をプログラムで取得する方法はいくつかあります。
PackageManager
からバージョンを入手してください。これはほとんどの場合に最適な方法です。try {
String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
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
}
}
このコードは上記でいくつかの部分について説明しましたが、ここでもすべて含まれています。 "NameNotFoundException"がスローされる可能性があるため、try/catchブロックが必要です。
try {
String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}
私はこれが道を歩いている誰かのために物事を単純化すると思います。 :)
基本的に、 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();
}
ただし、アプリケーションの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)
私の限られた英語力を許してください、しかしこれが役立つことを願っています。
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";
}
これを試してください。
try
{
device_version = getPackageManager().getPackageInfo("com.google.Android.gms", 0).versionName;
}
catch (PackageManager.NameNotFoundException e)
{
e.printStackTrace();
}
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;
}
}
最初:
import Android.content.pm.PackageManager.NameNotFoundException;
そしてこれを使う:
PackageInfo pInfo = null;
try {
pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
String versionName = pInfo.versionName;
内部フラグメントの使用例.
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
バージョンコードだけを取得してアプリが更新されたかどうかを確認する必要があるため、更新されたものを取得するにはプレイストアを起動する必要がありました。私はこうやった。
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
}
}
PackageInfo pinfo = null;
try {
pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
int versionNumber = pinfo.versionCode;
String versionName = pinfo.versionName;
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();
}
バージョンコードによってapkを識別するために使用されるビルドコードを取得します。バージョンコードは、データベースのアップグレード時、発行時などに実際のビルド構成を検出するために使用されます。
int versionCode = BuildConfig.VERSION_CODE;
バージョン名は、developmentmemtシーケンスの開発者または開発者を支持するために使用されます。必要に応じて任意の種類のバージョン名を追加できます
文字列versionName = BuildConfig.VERSION_NAME;
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())
}
}
感謝しないでください:-)
ビルドシステムに役立ちます。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": {}
}
]
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
}