如何在xml中使用gradle占位符applicationId来制作唯一的contentProvider权限

How to use gradle placeholder applicationId in xml to make unique contentProvider authority

我有以下可搜索的 xml 声明:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:label="@string/app_name"
    android:voiceSearchMode="showVoiceSearchButton"
    android:includeInGlobalSearch="true"
    android:searchMode="queryRewriteFromText"
    android:searchSuggestAuthority="com.mypackage.MyRecentSuggestionsProvider"
    android:searchSuggestSelection=" ?"
    android:hint="@string/search_hint">

</searchable>

现在这里是 contentProvider 本身:

package com.mypackage.contentProviders

import android.content.SearchRecentSuggestionsProvider
import com.mypackage.BuildConfig
     class MySuggestionsProvider : SearchRecentSuggestionsProvider() {

        val AUTHORITY = BuildConfig.APPLICATION_ID + ".MySuggestionsProvider"
        val MODE = SearchRecentSuggestionsProvider.DATABASE_MODE_QUERIES

       init{
            setupSuggestions(AUTHORITY, MODE)
        }
    }

现在的问题是我在 gradle 中有 3 种风格,所以 contentProvider class 中定义权限的行使用应用程序 ID 使其唯一,以便所有 3 种风格都可以存在同时在设备上。我记得,两个应用程序不能有重复的权限。

现在我的 problem:i 不想覆盖 searchable.xml 每种风格,只是为了为每种风格声明另一个权限。我宁愿做这样的事情:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:label="@string/app_name"
    android:voiceSearchMode="showVoiceSearchButton"
    android:includeInGlobalSearch="true"
    android:searchMode="queryRewriteFromText"
    android:searchSuggestAuthority="{applicationId}.MyRecentSuggestionsProvider"
    android:searchSuggestSelection=" ?"
    android:hint="@string/search_hint">

</searchable>

我们经常将 android 清单用作占位符。无论如何,我不必为内容提供者创建不同的 xml 声明,而是以某种方式使其每种口味独一无二?

清单占位符在资源中不起作用。但是,您可以:

  • 在Gradle中使用resValue根据风味为字符串资源定义不同的值,然后让android:searchSuggestAuthority引用该字符串资源

  • 为每种口味设置源集,在每一个中定义一个字符串资源,然后让 android:searchSuggestAuthority 引用该字符串资源

  • 每个口味都有源集,每个都有不同的 searchable.xml 副本,这是您要避免的