आप ऐप के (लेआउट) एक्सएमएल चर से मैनिफेस्ट संस्करण संख्या कैसे प्राप्त कर सकते हैं?


184

मैं कोड के मुख्य भाग में प्रोजेक्ट के मैनिफ़ेस्ट संस्करण संख्या को संदर्भित करने का एक तरीका रखना चाहूंगा। अब तक जो मैं कर रहा था, वह स्ट्रिंग संख्या 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;
हारून क्लैप

1
@ शुभ मुझे ऐसा नहीं लगता।
कॉन्स्टेंटिन बुरोव

3
Gradle fokes के लिए अपने उत्तर में 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
ग्रिडो

1
मैंने जो किया था वह प्रकट संस्करण नाम को अछूता नहीं छोड़ता है (लेकिन जब भी कोई नया रिलीज़ होता है तो इसे अपडेट करें) और स्ट्रिंग का उपयोग करें। उस मूल्य को संग्रहीत करने के लिए जिसका उपयोग मैं पूरे ऐप में करूंगा।
numediaweb

1
इसके लिए AndroidStudio, फ़ाइल versionNameमें एक सेट द्वारा प्रकट ओवरराइड किया जाता हैbuild.gradle
एड्रियन सी।

66

आप versionNameXML संसाधनों का उपयोग कर सकते हैं , जैसे गतिविधि लेआउट। पहले नोड 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 में उपयोग कर सकते हैं । एंड्रॉइड स्टूडियो इसे लाल रंग से चिह्नित करेगा, लेकिन ऐप बिना मुद्दों के संकलन करेगा। उदाहरण के लिए, इसका उपयोग इस तरह किया जा सकता है 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 पोस्ट ur gradle कोड
अरुण शंकर

3
इसे सबसे अच्छा उत्तर माना जाना चाहिए।
पेपन

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>

उफ़। मैं एक और टिप्पणी के आधार पर वरीयता XML सोच रहा होगा।
seastland

फिर भी, मैं अभी भी उसके उत्तर को कॉपी और पेस्ट करूंगा।
मथिज्स सीजर

13

मैं उपयोग करता हूं BuildConfig.VERSION_NAME.toString();। उस के बीच अंतर क्या है और इसे पैकेजमैन से प्राप्त करना है?

कोई XML आधारित समाधान मेरे लिए काम नहीं किया है, क्षमा करें।


7
BuildConfig.VERSION_NAME पहले से ही एक स्ट्रिंग है, उस पर toString () को कॉल करने की आवश्यकता नहीं है।
मकोतोसन

आदत। मेला पर्याप्त
मुलज़मन

ऐसे मामले हैं जब आपके प्रोजेक्ट में इसे कॉल करने से आपको उम्मीद है कि इससे अलग परिणाम मिल सकते हैं। उदाहरण के लिए यदि आप अपनी परियोजना में एक एंड्रॉइड सबमॉड्यूल का उपयोग करते हैं और आप इसे सबमॉड्यूल के कोड से कॉल करते हैं तो यह सबमॉड्यूल के कॉन्फ़िगरेशन को बनाने के लिए संदर्भित करेगा जिसमें भिन्न संस्करण हो सकते हैं। या यदि आप इसे अपने प्रोजेक्ट के कोड से कॉल करते हैं तो आप गलती से संदर्भ ले सकते हैं ताकि आपके सबमॉड्यूल का कॉन्फिगरेशन बन सके और वही परिणाम मिल सके। बस सावधान रहें और डबल जांचें कि आप बिल्ड कॉन्फ़िगरेशन के उचित पैकेज का संदर्भ देते हैं।
माइकेल

इस गाइड का उपयोग करने का प्रयास करें: medium.com/@manas/…
CrandellWS

अंतर बिल्डकॉन्फिग ग्रैडल द्वारा प्रदान किया जाता है, जबकि रनटाइम पर इसे पैकेजमैनगर (ओएस) द्वारा प्राप्त किया जाता है
ईशान कुमार

12

यदि आप ग्रैडल का उपयोग कर रहे हैं, तो आप compile समय पर xml संसाधनों में प्रोग्रामेटिक रूप से मान जोड़ने के लिए build.gradle फ़ाइल का उपयोग कर सकते हैं।

उदाहरण कोड निकाला गया: 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
सबसे अच्छा जवाब कभी !!
रहेल हसन

2

आप इसे XML से उपयोग नहीं कर सकते।

आपको XML में उपयोग किए जा रहे विजेट को विस्तारित करने की आवश्यकता है और Konstantin Burov के उत्तर पर उल्लिखित पाठ का उपयोग करके तर्क सेट करने के लिए तर्क जोड़ें।


मुझे इस बात का डर था ... मदद के लिए धन्यवाद!
पियर्सनआर्टफोथो

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क्या गलत है?
सग

मुझे यकीन नहीं है लेकिन लगता है कि यह बाद में एपीआई के लिए है?
Mafro34

@PearsonArtPhoto वास्तव में, यह कहाँ कहता है कि?
Mafro34

काम नहीं करता; मजेदार संख्या देता है जो @Suge ने ऊपर बताया
पेपन

सभी पर काम नहीं करता है और पहले से पोस्ट किए गए यादृच्छिक मूल्य देता है
A_rmas
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.