2015-03-10 1 views
83

Возможно ли получить доступ к значению BuildConfig из AndroidManifest.xml?Как я могу получить доступ к значению BuildConfig в моем файле AndroidManifest.xml?

В моем файле build.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 определяются в моем gradle.properties файлов:

# Facebook identifier (app ID) 
FACEBOOK_APP_ID=XXXXXXXXXX 

Чтобы использовать Facebook подключить в моем приложении, я должен добавить этот линия к моему AndroidManifest.xml:

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

Я хочу, чтобы заменить @string/applicationId поля BuildConfig FACEBOOK_APP_ID, определенное в Gradle, как это:

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

Это возможно с помощью BuildConfig? Если нет, как я могу это достичь?

ответ

111

Заменить

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID 

с

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID 

затем rebuild your project (Android Studio -> Build -> Rebuild Project).

Эти две команды генерируют сгенерированные значения - состоящие из констант Java в первом случае и ресурсы Android во втором - во время сборки проекта, но второй метод будет генерировать значение ресурса string, к которому можно получить доступ, используя синтаксис @string/FACEBOOK_APP_ID , Это означает, что он может использоваться как в манифесте, так и в коде.

+1

Это точный код, я использую, но я столкнулся с проблемой: Facebook SDK читает как целое по какой-либо причине, а затем генерирует исключение ClassCastException, поскольку Integer не может быть передан в String. Кто-нибудь столкнулся с этой проблемой? –

+0

@ W.K.S Если вы посмотрите на файл сгенерированных ресурсов, соответствует ли тип ресурса тому, что вы ожидаете (строка)? – stkent

+0

это строка: ' 15233522 ...' –

2

Другой вариант: использовать другой файл строку ресурсов, чтобы заменить все Вкусовые-зависимые значения:

Шаг 1: Создать новую папку в «Src» папку с именем вашего вкуса, им мой случай " этап»

Шаг 2: Создание файлов ресурсов для всех файлов, которые зависят от вкуса , например:

enter image description here

Шаг 3: Я также использую разные значки, поэтому вы также видите папки mipmap. Для этого важны только «strings.xml». Теперь вы можете перезаписать все важные строковые ресурсы. Вам нужно всего лишь включить те, которые вы хотите переопределить, все остальные будут использоваться от основного «strings.xml», он будет отображаться в Android Studio, как это:

enter image description here

Шаг 4: Использование строковые ресурсы в вашем проекте и релакс:

enter image description here

+0

Хорошая альтернатива, особенно если у вас есть много других строк, которые вам нужно установить для каждого варианта. – stkent

58

Другой способ доступа к Gradle Строить значения Config из вашего 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

Это отличное решение. – BinaryShrub

+0

Да, это хороший метод для инъекций только для манифеста! – stkent

+0

Как вы получите значение от manifestPlaceholders в java? Это было бы полезно для констант, используемых как в Java-коде, так и в манифесте. –

5

Доступ к свойствам build.gradle в вашем манифесте, как показано в следующем примере:

Например у вас есть свойство "ApplicationID" в вашем build.gradle и вы хотите получить доступ, что в вашем AndroidManifest:

enter image description here

доступа "ApplicationID" в AndroidManifest:

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

Спасибо @Vinay – user1510006

0

@stkent это хорошо, но забывает добавить, что вам нужно, чтобы восстановить свой проект после

Заменить

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 
9

примечание: при использовании resValue значение может быть случайно переопределено файлом ресурсов строк (например, для другого языка)

Чтобы получить истинное постоянное значение, которое вы можете использовать в манифесте и в java-коде, используйте как 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 
+0

Не работает он показывает неверный идентификатор приложения, из манифеста, но когда он установлен из java, тогда он работает –

+0

Я думаю, что это не сработает, если вы попытаетесь добавить более одной константы! –

+0

@GregEnnis Также более константы работают отлично для меня: например. Я просто называю 'addConstant()' дважды (с разными 'constantNames', конечно). Какая у вас ошибка? – TmTron

 Смежные вопросы

  • Нет связанных вопросов^_^