Як ви можете отримати номер версії Manifest за допомогою змінних XML програми (Макет)?


184

Мені б хотілося, щоб у головній частині коду було вказано номер маніфесту проекту. Те, що я робив до цього часу, - це пов’язати номер версії у файлі String XML з маніфестом (@ string / Version). Що я хотів би зробити, це зробити це навпаки, прив’язати рядкову змінну XML до версії в маніфесті. Причина? Мені потрібно лише змінити номер версії в одному місці, файл маніфесту. Чи можна це зробити? Дякую!


17
Це НЕ дублікат. Питання, про яке йдеться, запитує, як зробити те саме в CODE, я запитую в XML. Дві дуже різні конструкції в програмуванні Android ...
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;
Аарон Клап

1
@Shubh Я так не думаю.
Костянтин Буров

3
Додайте BuildConfig.VERSION_NAME до своєї відповіді на граді-фоки.
роботодавець

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
Griddo

1
Що я зробив - залишити назву версії маніфесту недоторканою (але оновлювати її щоразу після нової версії) і використовувати string.xml для зберігання значення, яке я буду використовувати в додатку.
numediaweb

1
Бо AndroidStudioманіфест versionNameпереосмислює той набір у build.gradleфайлі
Адріан К.

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
Це краще, ніж програмний стиль.
Нейромедіатор

2
Чудове рішення. Дякую тонну.
Самік Бандіопадхай

2
Я використовую найновіші і досі працює для мене. Я використовую цю та кілька інших змінних, як ця. @ k2col яку помилку ви отримуєте під час компіляції? Pls post ur gradle code
Arun Shankar

3
Це слід вважати найкращою відповіддю.
pepan

15

Я вирішив цю проблему шляхом розширення класу «Налаштування».

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(); . Яка різниця між цим та отриманням його з пакетаManager?

Жодні рішення на основі XML не працювали для мене, вибачте.


7
BuildConfig.VERSION_NAME - це вже рядок, не потрібно викликати в ньомуString ().
Макотосан

Звичка. Досить справедливо
Муллазман

Є випадки, коли виклик цього проекту у вашому проекті може отримати інший результат від того, що ви очікували. Наприклад, якщо ви використовуєте андроїдний підмодуль у своєму проекті, і ви викликаєте його з коду підмодуля, він посилається на створення конфігурації підмодуля, який може мати різну версію. Або якщо ви зателефонуєте йому з коду свого проекту, ви можете помилково посилатися на створення конфігурації свого підмодуля та отримання того ж результату. Будьте обережні і двічі перевірте, чи посилаєтесь на належний пакет конфігурації збірки.
MikeL

Спробуйте використовувати цей посібник: medium.com/@manas / ...
CrandellWS

різниця полягає в тому, що BuilConfig надає Gradle, тоді як отримати його під час виконання - PackageManager (OS)
Ішаан Кумар,

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
найкраща відповідь коли-небудь !!
Рахіль Хасан

2

Ви не можете використовувати його з XML.

Вам потрібно розширити віджет, який ви використовуєте в XML, і додати логіку, щоб встановити текст, використовуючи те, що згадується у відповіді Костянтина Бурова.


Я цього боявся ... Дякую за допомогу!
PearsonArtPhoto

2
ми можемо ним скористатися. будь ласка, перевір мою відповідь. Я використовую його у своєму додатку
Арун Шанкар

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. Що не так?
Суге

Я не впевнений, але думаю, що це для пізніших API?
Mafro34

@PearsonArtPhoto насправді, де це говорить?
Mafro34

не працює; повертає кумедне число, яке @Suge вказав вище
pepan

взагалі не працює і повертає випадкове значення, як раніше було розміщено
A_rmas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.