앱의 (레이아웃) 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매니페스트 versionName는 build.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.