আমি কীভাবে আমার AndroidManLive.xML ফাইলটিতে বিল্ডকনফিগ মানটি অ্যাক্সেস করতে পারি?


137

অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল থেকে বিল্ডকনফিগ মানটি অ্যাক্সেস করা কি সম্ভব?

আমার বিল্ড.gradle ফাইলে, আমার কাছে রয়েছে:

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 আমার গ্রেড.প্রোপার্টি ফাইলগুলিতে সংজ্ঞায়িত করা হয়েছে:

# Facebook identifier (app ID)
FACEBOOK_APP_ID=XXXXXXXXXX

আমার অ্যাপ্লিকেশনটিতে ফেসবুক সংযোগ ব্যবহার করতে, আমাকে অবশ্যই এই ল্যান্ডটি আমার অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলে যুক্ত করতে হবে:

<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"/> 

বিল্ডকনফিগ ব্যবহার করে কি তা সম্ভব? যদি তা না হয় তবে আমি কীভাবে এটি অর্জন করতে পারি?

উত্তর:


190

প্রতিস্থাপন করা

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

সঙ্গে

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

তারপরে আপনার প্রকল্পটি পুনঃনির্মাণ করুন (অ্যান্ড্রয়েড স্টুডিও -> বিল্ড -> পুনর্নির্মাণ প্রকল্প)।

দুটি কমান্ড উভয়ই উত্পাদিত মান উত্পাদন করে - প্রথম ক্ষেত্রে জাভা ধ্রুবক এবং দ্বিতীয়টিতে অ্যান্ড্রয়েড সংস্থানগুলি নিয়ে গঠিত - প্রকল্প তৈরির সময়, তবে দ্বিতীয় পদ্ধতিটি এমন একটি stringসংস্থান মান তৈরি করে যা @string/FACEBOOK_APP_IDসিনট্যাক্স ব্যবহার করে অ্যাক্সেস করা যায় । এর অর্থ এটি ম্যানিফেস্টে পাশাপাশি কোডেও ব্যবহার করা যেতে পারে।


1
এটি হ'ল কোডটি আমি ব্যবহার করছি তবে আমি একটি সমস্যার মুখোমুখি হয়েছি: ফেসবুক এসডিকে কোনও কারণে পূর্ণসংখ্যা হিসাবে স্ট্রিংটি পড়ে এবং ক্লাসকাস্টএক্সসেপশন নিক্ষেপ করে কারণ পূর্ণসংখ্যা স্ট্রিংয়ে কাস্ট করা যায় না। কেউ কি এই সমস্যার মুখোমুখি হয়েছেন?
WKS

@ ডাব্লু কেএস আপনি যদি উত্পন্ন উত্স ফাইলটি দেখুন তবে কি সংস্থানটির ধরণটি আপনার প্রত্যাশা (স্ট্রিং) এর সাথে মেলে?
stkent

এটির স্ট্রিং:<item name="facebook_app_id" type="string">15233522...</item>
WKS

13
নিশ্চিত করুন যে আপনি resValue "স্ট্রিং" লিখেছেন এবং "স্ট্রিং" -র পুনরুদ্ধার করবেন না
কীবি

1
আপনি যদি বুলিয়ান মান ব্যবহার করতে চান তবে নিশ্চিত হয়ে নিন যে আপনি "বুলিয়ান" -> tanelikorri.com/tutorial/android/set-variables-in-build-gradle
reavcn

85

আপনার অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল থেকে গ্রেডল বিল্ড কনফিগার মানগুলিতে অ্যাক্সেসের অন্য উপায় হ'ল স্থানধারকগুলির মাধ্যমে এটি:

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/man प्रकिया- উত্সাহক )


2
এটি একটি দুর্দান্ত সমাধান।
বাইনারিশ্রব

2
হ্যাঁ, এটি ম্যানিফেস্ট-কেবল স্ট্রিং ইনজেকশনের জন্য একটি দুর্দান্ত পদ্ধতি!
stkent

2
আপনি জাভাতে ম্যানিফেস্টপ্লেসোল্ডারদের কাছ থেকে কীভাবে একটি মূল্য পাবেন? এটি উভয় জাভা কোড এবং ম্যানিফেস্টে ব্যবহৃত ধ্রুবকদের জন্য দরকারী হবে।
লুই সিএডি

@ লুইসক্যাড আমি মনে করি আপনি নিজের বিল্ড ফাইলটিতে একটি ভেরিয়েবল সংজ্ঞায়িত করতে চেষ্টা করতে পারেন, তারপরে এটি আপনার স্থানধারক এবং (অতিরিক্ত) বিল্ডকনফিগ ক্ষেত্রটি সংজ্ঞায়িত করতে ব্যবহার করুন, যাতে আপনি এটি আপনার কোডটিতে ব্যবহার করতে পারেন।
গ্রেগরিেক

1
@ লুইসক্যাড আমি এটি চেষ্টা করি নি, তবে আপনি নিম্নলিখিতগুলি চেষ্টা করতে পারেন: var স্থানধারক = 'আপনার স্থানধারক' (নতুন লাইন) বিল্ডকনফিগফিল্ড "স্ট্রিং", "পিএলসিএইচএলোল্ডার্ড", স্থানধারক (নতুন লাইন) ম্যানিফেস্টপ্লেসোল্ডার = [স্থানধারক নাম: প্লাচোল্ডার] (নতুন লাইন) এটি আপনার পক্ষে কাজ করে কিনা তা জানতে পেরে আনন্দিত হবে
গ্রেগরিেকে

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
@ গ্রেগেনিস এছাড়াও আরও ধ্রুবকগুলি আমার পক্ষে ভাল কাজ করে: যেমন আমি কেবল addConstant()দু'বার কল করি ( constantNamesঅবশ্যই বিভিন্ন সাথে ) different আপনি কি ত্রুটি পেতে পারি?
টিএমট্রন

1
@ টিএমট্রন আপনি কোনও ত্রুটি পেতে চান না, তবে আপনি যতবার 'ডাকে ম্যানিফেস্টপ্লেসধারক' অ্যারে যখনই ডাকা হয় ততবারই পুনরায় নিয়োগ করেন, কেবলমাত্র ব্যবহৃত শেষ মানটি সংরক্ষণ করে।
গ্রেগ এনিস

@ গ্রেগইনিসিস আপনি একদমই দীর্ঘস্থায়ী! আমার পরীক্ষা-প্রকল্পে আমার একটি আলাদা কোড রয়েছে। আমি ইতিমধ্যে আমার উত্তর আপডেট করেছি: আমাদের কেবল +=অপারেটরটি ব্যবহার করা দরকারmanifestPlaceholders += [...]
টিএমট্রন

6

নিম্নলিখিত উদাহরণ হিসাবে আপনার ম্যানিফেস্টে build.gradle বৈশিষ্ট্য অ্যাক্সেস:

উদাহরণস্বরূপ আপনার বিল্ড.gradle এ আপনার একটি সম্পত্তি "অ্যাপ্লিকেশনআইডি" রয়েছে এবং আপনি এটি আপনার অ্যান্ড্রয়েড ম্যানিফেস্টে অ্যাক্সেস করতে চান:

এখানে চিত্র বর্ণনা লিখুন

অ্যান্ড্রয়েড ম্যানিফেস্টে "অ্যাপ্লিকেশনআইডি" অ্যাক্সেস করুন:

<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);

আমি কি ফেসবুক অ্যাপআইডি সংজ্ঞায়িত করতে পারি:। "ব্যক্তিগত আইডি ..." প্রপার্টি ফাইলে যেখানে আমি আমার স্টোরের পাসওয়ার্ড এবং সমস্ত সংরক্ষণ করব। তারপরে আমি ম্যানিফেস্টপ্লেস্টধারীদের অ্যাক্সেস করি যা পরোক্ষভাবে অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলে প্রবেশ করা যেতে পারে। আমি কি এটা করতে পারি?
আমান ভার্মা

3

@ স্টকেন্ট ভাল তবে এটি যোগ করতে ভুলে যায় যে আপনাকে পরে আপনার প্রকল্পটি পুনর্নির্মাণ করতে হবে

প্রতিস্থাপন করা

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

সঙ্গে

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

তারপর

Android Studio -> Build -> Rebuild Project

এটি অ্যান্ড্রয়েডের মাধ্যমে অ্যাক্সেসযোগ্য স্ট্রিং রিসোর্স তৈরি করতে অনুমতি দেবে

R.string.FACEBOOK_APP_ID

প্রোডাক্ট ফ্লাওয়ার_এর জন্য 'FACEBOOK_APP_ID' অজানা সম্পত্তি পেতে পারেনি ...
f.trajkovski

2

অন্য বিকল্প: সমস্ত ফ্লেভার-নির্ভর মানগুলি প্রতিস্থাপন করতে একটি ভিন্ন স্ট্রিং রিসোর্স ফাইল ব্যবহার করুন:

পদক্ষেপ 1: আপনার গন্ধের নাম সহ "এসসিআর" ফোল্ডারে একটি নতুন ফোল্ডার তৈরি করুন, আমার কেস "স্টেজ"

পদক্ষেপ 2: স্বাদের উপর নির্ভরশীল এমন সমস্ত ফাইলের জন্য রিসোর্স ফাইলগুলি তৈরি করুন:

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ 3: আমি বিভিন্ন আইকনও ব্যবহার করছি, তাই আপনি মিপম্যাপ ফোল্ডারগুলিও দেখতে পাবেন। এই সজ্জার জন্য, কেবলমাত্র "স্ট্রিং.এক্সএমএল" গুরুত্বপূর্ণ। এখন আপনি সমস্ত গুরুত্বপূর্ণ স্ট্রিং রিসোর্স ওভাররাইট করতে পারেন। আপনি কেবল যেটিকে ওভাররাইড করতে চান সেটি অন্তর্ভুক্ত করতে হবে, অন্য সমস্তগুলি মূল "স্ট্রিং.এক্সএমএল" থেকে ব্যবহৃত হবে, এটি অ্যান্ড্রয়েড স্টুডিওতে এটি প্রদর্শিত হবে:

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ 4: আপনার প্রকল্পের স্ট্রিং সংস্থানগুলি ব্যবহার করুন এবং শিথিল করুন:

এখানে চিত্র বর্ণনা লিখুন


একটি ভাল বিকল্প, বিশেষত আপনার কাছে প্রতি ভেরিয়েন্ট সেট করার জন্য আরও অনেকগুলি স্ট্রিং রয়েছে।
স্টেকেন্ট

আমি কি ফেসবুক অ্যাপআইডি সংজ্ঞায়িত করতে পারি:। "ব্যক্তিগত আইডি ..." প্রপার্টি ফাইলে যেখানে আমি আমার স্টোরের পাসওয়ার্ড এবং সমস্ত সংরক্ষণ করব। তারপরে আমি ম্যানিফেস্টপ্লেস্টধারীদের অ্যাক্সেস করি যা পরোক্ষভাবে অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলে প্রবেশ করা যেতে পারে। আমি কি এটা করতে পারি?
আমান ভার্মা

0

আপনি নীচে হিসাবে দীর্ঘ মান ব্যবহার করতে পারেন

বিল্ডকনফিগফিল্ড 'দীর্ঘ', 'FLAVOR_LONG', '11500L'

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.