मैं अपने AndroidManifest.xml फ़ाइल में BuildConfig मान का उपयोग कैसे कर सकता हूं?


137

क्या AndroidManifest.xml से BuildConfig मान का उपयोग संभव है?

मेरी बिल्ड.ग्रेड फ़ाइल में, मेरे पास:

defaultConfig {
    applicationId "com.compagny.product"
    minSdkVersion 16
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"

    // Facebook app id
    buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID
}

FACEBOOK_APP_ID मेरे gradle.properties फ़ाइलों में परिभाषित किया गया है:

# Facebook identifier (app ID)
FACEBOOK_APP_ID=XXXXXXXXXX

अपने ऐप में फेसबुक कनेक्ट का उपयोग करने के लिए, मुझे इस लाइन को अपने AndroidManifest.xml में जोड़ना होगा:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/applicationId"/> 

मैं इस तरह @string/applicationIdसे ग्रेडेल में FACEBOOK_APP_IDपरिभाषित बिल्डकोनफिग क्षेत्र द्वारा प्रतिस्थापित करना चाहता हूं :

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="FACEBOOK_APP_ID"/> 

क्या BuildConfig का उपयोग करना संभव है? यदि नहीं, तो मैं इसे कैसे प्राप्त कर सकता हूं?

जवाबों:


190

बदलने के

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

साथ में

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

फिर अपनी परियोजना का पुनर्निर्माण करें (Android Studio -> बिल्ड -> पुनर्निर्माण परियोजना)।

दोनों कमांड उत्पन्न मानों को उत्पन्न करते हैं - पहले मामले में जावा स्थिरांक से मिलकर, और दूसरे में एंड्रॉइड संसाधन - प्रोजेक्ट के निर्माण के दौरान, लेकिन दूसरी विधि एक stringसंसाधन मान उत्पन्न करेगी जिसे @string/FACEBOOK_APP_IDसिंटैक्स का उपयोग करके एक्सेस किया जा सकता है । इसका मतलब यह है कि इसे मैनिफ़ेस्ट के साथ-साथ कोड में भी इस्तेमाल किया जा सकता है।


1
यह सटीक कोड है जिसका मैं उपयोग कर रहा हूं, लेकिन मैं एक समस्या का सामना कर रहा हूं: फेसबुक एसडीके किसी कारण से स्ट्रिंग को पूर्णांक के रूप में पढ़ता है और फिर एक क्लासकैस्ट अपवाद को फेंकता है क्योंकि इंटगर को स्ट्रिंग में नहीं डाला जा सकता है। क्या किसी ने इस मुद्दे का सामना किया है?
WKS

यदि आप जनरेट किए गए संसाधन फ़ाइल को देखते हैं, तो क्या संसाधन प्रकार वहां आपकी अपेक्षा (स्ट्रिंग) से मेल खाता है?
स्टक

यह स्ट्रिंग है:<item name="facebook_app_id" type="string">15233522...</item>
WKS

13
सुनिश्चित करें कि आप resValue "स्ट्रिंग" लिखें और "स्ट्रिंग" का पुनरुत्पादन न करें
कीबी

1
यदि आप एक बूलियन मान का उपयोग करना चाहते हैं, तो सुनिश्चित करें कि आप "बूलियन" के बजाय "बूल" लिख दें -> tanelikorri.com/tutorial/android/set-variables-in-build-gradle
reavcn

85

अपने AndroidManifest.xml से ग्रेड बिल्ड कॉन्फिगर वैल्यूज एक्सेस करने का एक और तरीका इस तरह से प्लेसहोल्डर्स के माध्यम से है:

android {
    defaultConfig {
        manifestPlaceholders = [ facebookAppId:"someId..."]
    }
    productFlavors {
        flavor1 {
        }
        flavor2 {
            manifestPlaceholders = [ facebookAppId:"anotherId..." ]
        }
    }
}

और फिर आपके प्रकट में:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${facebookAppId}"/> 

अधिक विवरण यहां देखें: https://developer.android.com/studio/build/manifest-build-variables.html

(संदर्भ के लिए पुराना लिंक: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger )


2
यह एक बेहतरीन उपाय है।
बाइनरीश्रब

2
हाँ, यह केवल-केवल स्ट्रिंग इंजेक्शन के लिए एक अच्छा तरीका है!
स्टेंटेंट

2
आपको जावा में घोषणापत्र धारकों से एक मूल्य कैसे मिलेगा? यह जावा कोड और प्रकट रूप में उपयोग किए गए स्थिरांक के लिए उपयोगी होगा।
लुई सीएडी

@LouisCAD मुझे लगता है कि आप अपनी बिल्ड फ़ाइल में एक चर को परिभाषित करने की कोशिश कर सकते हैं, फिर इसका उपयोग अपने प्लेसहोल्डर और (इसके अलावा) बिल्डकॉन्फ़िग फ़ील्ड को परिभाषित करने के लिए कर सकते हैं, इसलिए आप इसे अपने कोड में उपयोग कर सकते हैं।
ग्रेगोरी

1
@LouisCAD मैंने वह प्रयास नहीं किया, लेकिन आप निम्नलिखित की कोशिश कर सकते हैं: var प्लेसहोल्डर = 'आपका प्लेसहोल्डर' (नई लाइन) buildConfigField "स्ट्रिंग", "PLACEHOLDER_NAME", प्लेसहोल्डर (नई लाइन): घोषणापत्रधारक = [प्लेसहोल्डरनाम: placholder] (नया) लाइन) यह जानकर खुशी होगी कि यह आपके लिए काम करता है
ग्रेगरीK

40

नोट: जब आप resValueमूल्य का उपयोग करते हैं तो गलती से स्ट्रिंग संसाधन फ़ाइल (जैसे किसी अन्य भाषा के लिए) द्वारा ओवरराइड किया जा सकता है

सही निरंतर मान प्राप्त करने के लिए जिसे आप मेनिफ़ेस्ट और जावा-कोड में उपयोग कर सकते हैं, दोनों का उपयोग करें manifestPlaceholdersऔर buildConfigField: उदा

android {
    defaultConfig {
        def addConstant = {constantName, constantValue ->
            manifestPlaceholders += [ (constantName):constantValue]
            buildConfigField "String", "${constantName}", "\"${constantValue}\""
        }

        addConstant("FACEBOOK_APP_ID", "xxxxx")
    }

मैनिफ़ेस्ट फ़ाइल में पहुँच:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${FACEBOOK_APP_ID}"/>

जावा से:

BuildConfig.FACEBOOK_APP_ID

यदि निरंतर मान को बिल्ड-टाइप-विशिष्ट होने की आवश्यकता है, तो सहायक addConstantको घुमाया जाना चाहिए (ग्रूवी क्लोजर शब्दार्थ के साथ काम करने के लिए), उदाहरण के लिए,

buildTypes {
    def addConstantTo = {target, constantName, constantValue ->
        target.manifestPlaceholders += [ (constantName):constantValue]
        target.buildConfigField "String", "${constantName}", "\"${constantValue}\""
    }
    debug {
        addConstantTo(owner,"FACEBOOK_APP_ID", "xxxxx-debug")
    }
    release {
        addConstantTo(owner,"FACEBOOK_APP_ID", "xxxxx-release")
    }

1
काम नहीं, यह प्रकट से, अमान्य ऐप आईडी दिखाता है, लेकिन जब जावा से सेट किया जाता है तो यह काम करता है
ब्रजेंद्र पांडेय

मुझे लगता है कि यदि आप एक से अधिक स्थिरांक जोड़ने की कोशिश करते हैं तो यह अभ्यस्त काम नहीं होगा!
ग्रेग एनिस

1
@GregEnnis मेरे लिए और अधिक स्थिरांक ठीक काम करते हैं: उदाहरण के लिए मैं सिर्फ addConstant()दो बार कॉल करता हूं ( constantNamesपाठ्यक्रम के विभिन्न के साथ )। आपको क्या त्रुटि मिल रही है?
TmTron

1
@TmTron में आपको कोई त्रुटि नहीं मिलती है, लेकिन आप हर बार जब भी बुलाया जाता है, तो पूरे 'घोषणापत्र' सरणी को फिर से असाइन करते हैं, केवल उपयोग किए गए अंतिम मान को संग्रहीत करते हैं।
ग्रेग एनिस

@GregEnnis तुम बिल्कुल चीर रहे हो! मेरे टेस्ट-प्रोजेक्ट में मेरा एक अलग कोड है। मैंने पहले ही अपना उत्तर अपडेट कर दिया है: हमें बस +=ऑपरेटर का उपयोग करने की आवश्यकता हैmanifestPlaceholders += [...]
TmTron

6

निम्न उदाहरण के रूप में अपने निर्माण में प्रवेश बिल्ड .ग्रेड गुण:

उदाहरण के लिए आपके बिल्ड.ग्रेडल में आपके पास एक संपत्ति "ApplicationId" है और आप इसे अपने AndroidManifest में एक्सेस करना चाहते हैं:

यहां छवि विवरण दर्ज करें

AndroidManifest में "ApplicationId" एक्सेस करें:

<receiver
        android:name="com.google.android.gms.gcm.GcmReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="${applicationId}" />
        </intent-filter>
    </receiver>

इसी प्रकार, हम अन्य स्थिरांक के लिए स्ट्रिंग संसाधन बना सकते हैं और उन्हें कोड फ़ाइलों में एक्सेस कर सकते हैं:

context.getString(R.string.GCM_SENDER_ID);

क्या मैं facebookAppId को परिभाषित कर सकता हूं: "एक और आईडी ..." में .properties फ़ाइल जहां मैं अपना स्टोर पासवर्ड और सभी सहेज रहा हूं। फिर मैं उन मेनिफेस्टहोल्डर्स तक पहुंच बनाता हूं जो अप्रत्यक्ष रूप से AndroidManifest.xml में एक्सेस किए जाएंगे। क्या मै वह कर सकता हूं?
अमन वर्मा

3

@stkent अच्छा है, लेकिन यह जोड़ना भूल जाता है कि आपको बाद में अपनी परियोजना को फिर से बनाने की आवश्यकता है

बदलने के

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

साथ में

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

फिर

Android Studio -> Build -> Rebuild Project

यह android के माध्यम से सुलभ स्ट्रिंग संसाधन उत्पन्न करने की अनुमति देगा

R.string.FACEBOOK_APP_ID

ProductFlavor_ के लिए अज्ञात संपत्ति 'FACEBOOK_APP_ID' नहीं मिल सकी ...
f.trajkovski

2

एक अन्य विकल्प: सभी स्वाद-निर्भर मूल्यों को बदलने के लिए एक अलग स्ट्रिंग संसाधन फ़ाइल का उपयोग करें:

चरण 1: अपने स्वाद के नाम के साथ "src" फ़ोल्डर में एक नया फ़ोल्डर बनाएं, मेरा मामला "चरण" पर रखें

चरण 2: उदाहरण के लिए स्वाद पर निर्भर सभी फ़ाइलों के लिए संसाधन फ़ाइलें बनाएँ:

यहां छवि विवरण दर्ज करें

चरण 3: मैं विभिन्न आइकनों का भी उपयोग कर रहा हूं, इसलिए आप मिपमैप फ़ोल्डर भी देख सकते हैं। इस उद्धरण के लिए, केवल "स्ट्रिंग्स.एक्सएमएल" महत्वपूर्ण है। अब आप सभी महत्वपूर्ण स्ट्रिंग संसाधनों को अधिलेखित कर सकते हैं। आपको केवल उन लोगों को शामिल करना होगा जिन्हें आप ओवरराइड करना चाहते हैं, अन्य सभी का उपयोग मुख्य "स्ट्रिंग्स.एक्सएमएल" से किया जाएगा, यह इस तरह से एंड्रॉइड स्टूडियो में दिखाई देगा:

यहां छवि विवरण दर्ज करें

चरण 4: अपनी परियोजना में स्ट्रिंग संसाधनों का उपयोग करें और आराम करें:

यहां छवि विवरण दर्ज करें


एक अच्छा विकल्प, खासकर यदि आपके पास कई अन्य तार हैं जिन्हें आपको प्रति-संस्करण सेट करने की आवश्यकता है।
स्टकेंट

क्या मैं facebookAppId को परिभाषित कर सकता हूं: "एक और आईडी ..." में .properties फ़ाइल जहां मैं अपना स्टोर पासवर्ड और सभी सहेज रहा हूं। फिर मैं उन मेनिफेस्टहोल्डर्स तक पहुंच बनाता हूं जो अप्रत्यक्ष रूप से AndroidManifest.xml में एक्सेस किए जाएंगे। क्या मै वह कर सकता हूं?
अमन वर्मा

0

आप नीचे के रूप में लंबे मूल्य का उपयोग कर सकते हैं

buildConfigField 'long', 'FLAVOR_LONG', '11500L'

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