앱의 (레이아웃) XML 변수에서 매니페스트 버전 번호를 어떻게 얻을 수 있습니까?


184

코드의 주요 부분에서 프로젝트의 매니페스트 버전 번호를 참조하는 방법을 원합니다. 지금까지 내가 한 일은 String XML 파일의 버전 번호를 매니페스트 (@ string / Version)에 연결하는 것입니다. 내가하고 싶은 것은 다른 방법으로 문자열 XML 변수를 매니페스트의 버전에 연결하는 것입니다. 이유? 매니페스트 파일 한 위치에서 버전 번호 만 변경하고 싶습니다. 이것을 할 수있는 방법이 있습니까? 감사!


17
이것은 복제본이 아닙니다. 문제는 CODE에서 동일한 작업을 수행하는 방법을 묻습니다 .XML에서 묻습니다. 안드로이드 프로그래밍에서 두 가지 매우 다른 구성 ...
PearsonArtPhoto

답변:


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;
Aaron Klap

1
@Shubh 나는 그렇게 생각하지 않습니다.
콘스탄틴 부 로프

3
gradle fokes에 대한 답변에 BuildConfig.VERSION_NAME을 추가하십시오.
jobbert

102

버전을 직접 가져 오는 방법은 없지만 두 가지 해결 방법이 있습니다.

  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
스럽

1
내가 한 것은 매니페스트 버전 이름을 그대로 유지하고 (새 릴리스가있을 때마다 업데이트) string.xml을 사용하여 앱 전체에서 사용할 값을 저장합니다.
numediaweb

1
의 경우 AndroidStudio매니페스트 versionNamebuild.gradle파일에 설정된 것
Adrian 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/versionNameXML에서 사용할 수 있습니다 . 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
프로그래밍 방식보다 낫습니다.
신경 전달 물질

2
훌륭한 해결책. 정말 감사합니다.
Samik Bandyopadhyay

2
나는 최신 버전을 사용하고 있으며 여전히 나를 위해 일합니다. 나는 이것과 이와 같은 다른 여러 변수를 사용합니다. @ k2col 컴파일하는 동안 어떤 오류가 발생합니까? Pls post ur gradle code
Arun Shankar

3
이것이 가장 좋은 대답으로 간주되어야합니다.
pepan

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>

죄송합니다. 다른 의견을 기반으로 Preference XML을 생각하고 있었을 것입니다.
seastland

그럼에도 불구하고, 나는 그의 대답을 어쨌든 복사하여 붙여 넣을 것입니다.
Mathijs Segers

13

사용 BuildConfig.VERSION_NAME.toString();합니다. packageManager에서 얻는 것과 차이점은 무엇입니까?

XML 기반 솔루션이 효과가 없었습니다. 죄송합니다.


7
BuildConfig.VERSION_NAME은 이미 문자열이므로 toString ()을 호출 할 필요가 없습니다.
Makotosan

습관. 충분히 공정
Mullazman

프로젝트에서 이것을 호출하면 예상과 다른 결과가 나타날 수 있습니다. 예를 들어 프로젝트에서 안드로이드 서브 모듈을 사용하고 서브 모듈의 코드에서 호출하면 버전이 다른 서브 모듈의 구성을 빌드하는 것을 참조합니다. 또는 프로젝트 코드에서 호출하면 실수로 하위 모듈의 구성을 빌드하고 동일한 결과를 얻을 수 있습니다. 빌드 구성의 적절한 패키지를 참조하는지주의해서 확인하십시오.
MikeL

이 안내서를 사용해보십시오. 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_versionXML에서 필요에 따라 사용하십시오.

.debug디버그 모드에있을 때 링크 된 기사에 설명 된대로 버전 이름에 추가 됩니다.


1
최고의 답변 !!
Raheel Hasan

2

XML에서는 사용할 수 없습니다.

XML에서 사용하는 위젯을 확장하고 Konstantin Burov의 답변에 언급 된 내용을 사용하여 텍스트를 설정하는 논리를 추가해야합니다.


나는 그것을 두려워했다 ... 도움을 주셔서 감사합니다!
PearsonArtPhoto

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. 무슨 일입니까?
Suge

확실하지 않지만 이것이 나중에 API 용이라고 생각합니까?
Mafro34

@PearsonArtPhoto 실제로, 그것은 어디에서 말하는가?
Mafro34

작동하지 않습니다. @Suge가 지적한 재미있는 숫자를 반환
pepan

전혀 작동하지
않으며
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.