アプリの(レイアウト)XML変数からマニフェストバージョン番号を取得するにはどうすればよいですか?


184

コードのメイン部分でプロジェクトのマニフェストバージョン番号を参照する方法が欲しいのですが。これまで私が行ってきたことは、String XMLファイルのバージョン番号をマニフェスト(@ string / Version)にリンクすることです。私がやりたいのは、逆にそれを行い、文字列XML変数をマニフェストのバージョンにリンクすることです。理由?マニフェストファイルという1つの場所でバージョン番号を変更するだけで済みます。これを行う方法はありますか?ありがとう!


17
これは重複ではありません。問題の質問は、CODEで同じことを行う方法を尋ねます。私はXMLで質問しています。Androidプログラミングにおける2つの非常に異なる構成...
PearsonArtPhoto 2013年

回答:


367

すでにここで答えられていると思います

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

または

int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;

8
ほとんど、しかし完全ではありません...私がやりたいことは、XMLコードを参照することですが、それは可能ではないように見えるので...
PearsonArtPhoto

どうもありがとうございます!!!私はこれをどこでも探していました:String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
アーロン・クラップ

1
@Shubh私はそうは思いません。
Konstantin Burov 2013

3
Gradle fokeの回答にBuildConfig.VERSION_NAMEを追加します。
jobbert 2016年

102

バージョンを直接入手する方法はありませんが、2つの回避策があります。

  1. バージョンはリソース文字列に格納され、次の方法でマニフェストに配置できます。

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.somepackage"
         android:versionName="@string/version" android:versionCode="20">
  2. カスタムビューを作成して、XMLに配置することもできます。ビューはこれを使用して名前を割り当てます。

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

これらのソリューションのどちらでも、バージョン名をXMLで配置できます。残念ながら、そのような、android.R.string.versionまたは何かのような、簡単な解決策はありません。


14
1.へのちょっとした注意:動作していますが、警告が表示されるのでお勧めしませんThe android:versionName cannot be a resource url, it must be a literal string
Griddo

1
私が行ったのは、マニフェストバージョン名を変更せず(ただし、新しいリリースのたびに更新します)、string.xmlを使用して、アプリ全体で使用する値を格納することです。
numediaweb 2013

1
ためAndroidStudio、マニフェストは、versionName内の1つのセットで上書きされbuild.gradleたファイル
エイドリアンC.

66

versionNameアクティビティレイアウトなどのXMLリソースでを使用できます。最初app/build.gradleに、androidノードに次のスニペットを含む文字列リソースを作成します。

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

したがって、build.gradleファイル全体の内容は次のようになります。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion '24.0.0 rc3'
    defaultConfig {
        applicationId 'com.example.myapplication'
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 17
        versionName '0.2.3'
        jackOptions {
            enabled true
        }
    }
    applicationVariants.all { variant ->
        variant.resValue "string", "versionName", variant.versionName
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
} 

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
    compile 'com.android.support:design:23.3.0'
    compile 'com.android.support:support-v4:23.3.0'
}

その後@string/versionName、XMLで使用できます。Android Studioはそれを赤でマークしますが、アプリは問題なくコンパイルされます。たとえば、これは次のように使用できますapp/src/main/res/xml/preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory
        android:title="About"
        android:key="pref_key_about">

        <Preference
            android:key="pref_about_build"
            android:title="Build version"
            android:summary="@string/versionName" />

    </PreferenceCategory>


</PreferenceScreen>


3
これは、プログラムスタイルよりも優れています。
神経伝達物質2016年

2
素晴らしいソリューション。トンありがとう。
Samik Bandyopadhyay

2
私は最新のものを使用していますが、まだうまくいきます。私はこれとこのような他のいくつかの変数を使用します。@ k2colコンパイル中にどのようなエラーが発生しますか?Plsがウルグラドルコードを投稿
Arun Shankar

3
これは最良の答えと考えるべきです。
pepan 2017

15

この問題は、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);
        }
    }
}

次に、私の設定XMLで:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <com.example.android.VersionPreference android:title="Version" />
</PreferenceScreen>

おっとっと。私は別のコメントに基づいて設定XMLを考えていたに違いありません。
イーストランド2013年

それにもかかわらず、私はとにかく彼の答えをコピーして貼り付けます。
Mathijs Segers 2015年

13

使用しますBuildConfig.VERSION_NAME.toString();。それとpackageManagerからそれを取得することの違いは何ですか?

申し訳ありませんが、XMLベースのソリューションは機能していません。


7
BuildConfig.VERSION_NAMEはすでに文字列であり、その上でtoString()を呼び出す必要はありません。
誠さん16

習慣。十分公正
Mullazman

プロジェクトでこれを呼び出すと、予想とは異なる結果が得られる場合があります。たとえば、プロジェクトでandroidサブモジュールを使用し、サブモジュールのコードから呼び出すと、異なるバージョンのサブモジュールのビルド構成を参照します。または、プロジェクトのコードから呼び出すと、誤って参照してサブモジュールの構成をビルドし、同じ結果が得られる場合があります。注意して、ビルド構成の適切なパッケージを参照していることを再確認してください。
MikeL 2016年

このガイドを使用してみてください:medium.com/@manas/...
CrandellWS

違いは、BuilConfigがGradleによって提供されるのに対し、実行時にそれを取得するのはPackageManager(OS)によることです
Ishaan Kumar

12

Gradleを使用している場合は、build.gradleファイルを使用して、コンパイル時にプログラムによってXMLリソースに値を追加できます。

以下から抽出したコードの例:https : //medium.com/@manas/manage-your-android-app-s-versioncode-versionname-with-gradle-7f9c5dcf09bf

buildTypes {
    debug {
        versionNameSuffix ".debug"
        resValue "string", "app_version", "${defaultConfig.versionName}${versionNameSuffix}"
    }
    release {
        resValue "string", "app_version", "${defaultConfig.versionName}"
    }
}

@string/app_version必要に応じてXMLで使用する

.debugデバッグモードの場合、リンクされた記事で説明されているように、バージョン名に追加されます。


1
最高の答え!
Raheel Hasan

2

XMLからは使用できません。

XMLで使用しているウィジェットを拡張し、Konstantin Burovの回答に記載されている内容を使用してテキストを設定するロジックを追加する必要があります。


恐れていました...助けてくれてありがとう!
PearsonArtPhoto 2010

2
使用できます。私の答えを確認してください。私は自分のアプリで使用しています
Arun Shankar

1

最も簡単な解決策はを使用することBuildConfigです。

BuildConfig.VERSION_NAMEアプリケーションで使用します。

を使用BuildConfig.VERSION_CODEして、バージョンコードを取得することもできます。


-3

ゲームに遅れますが@string/xyz、使用せずにそれを行うことができます?android:attr

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="?android:attr/versionName"
     />
    <!-- or -->
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="?android:attr/versionCode"
     />

11
私はこのように使用します:<Preference android:title="Version" android:summary="?android:attr/versionName" ></Preference>として表示し?16843292ます。何が問題なのですか?
2013

よくわかりませんが、これは後のAPI向けだと思いますか?
Mafro34 2013

@PearsonArtPhoto実際には、それはどこにそれを言うのですか?
Mafro34 2013

動作しません。@Sugeが上で指摘した面白い数字を返します
pepan

まったく機能せず、以前に投稿されたようにランダムな値を返します
A_rmas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.