Значение manifestPlaceholders не является строкой
В моем файле AndroidManifest.xml у меня есть следующий тег метаданных, который должен быть заполнен динамически:
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${FACEBOOK_APP_ID}"/>
Мой файл gradle выглядит следующим образом:
manifestPlaceholders = [
GOOGLE_PROJECT_ID: "A888844613784",
FACEBOOK_APP_ID: "888570042741264"
]
После создания и сборки FACEBOOK_APP_ID в файле манифеста выглядит так:
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="1481023616.000000" />
К сожалению, это не String, а значение float. Это не правильно или чего я хочу.
Я знаю, что есть еще один способ определить FACEBOOK_APP_ID
в файле string.xml
. Но так как у меня много вкусов, было бы неплохо и легко поддерживать, если бы мы поместили все параметры, связанные с вкусом, в файл build.gradle
вместо файлов strings.xml
.
Кто-нибудь знает, как избежать преобразования строки в float?
Ответы
Ответ 1
Вы можете использовать следующий код, чтобы добавить значение String в свои строковые ресурсы из файла build.gradle:
resValue 'string', 'FACEBOOK_APP_ID', 'facebook_application_id'
Но я не уверен, что файл AndroidManifest.xml не поддерживает строки, специфичные для вкуса (я помню, что вы получите предупреждение, если попытаетесь, но я не уверен).
Вы также можете попытаться добавить нулевой ограничитель в свой манифест FACEBOOK_APP_ID manifestPlaceholder, как это предложено в this:
FACEBOOK_APP_ID: "888570042741264\0"
Забастовкa >
Edit:
Метод нулевого терминатора кода, похоже, не работает при использовании непосредственно из файла build.gradle, однако он работает при использовании нулевого терминатора внутри файла AndroidManifest.xml
:
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${FACEBOOK_APP_ID}\0"/>
Ответ 2
Я использую manifestPlaceholder и заставляю gradle распознавать строку, экранируя кавычки следующим образом:
manifestPlaceholders = [facebook_app_id:"\"9999000099990000\"",
fb_login_protocol_scheme:"fb9999000099990000"]
Вам не нужно это для второго параметра, так как перед ним строка fb
.
Ответ 3
Это работает для меня (если вы не используете ароматизаторы, просто поместите resValue в defaultConfig):
productFlavors {
production {
resValue 'string', 'facebookAppId', '22222222222'
resValue 'string', 'facebookSchemeId', 'fb22222222222'
}
development {
resValue 'string', 'facebookAppId', '11111111111'
resValue 'string', 'facebookSchemeId', 'fb11111111111'
}
}
Тогда в декларации:
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebookAppId" />
<activity
android:name="com.facebook.CustomTabActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="@string/facebookSchemeId" />
</intent-filter>
</activity>