Значение 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>