Это средство создания динамических паттернов с возможностью нечёткого матчинга. Этот способ необходим, когда вы не можете описать паттерн статически или когда данные для паттерна могут меняться во времени. Примерами такого варианта являются имена контактов телефонной книги или названия приложений.
В тэге pattern
в атрибуте uri
нужно указать Uri со схемой content://
, который указывает, какой контент-провайдер использовать для формирования паттерна.
Таким образом можно формировать только паттерны верхнего уровня - т.е. те, которые описываются в самом модуле, а не в командах модуля.
Подробнее о контент-провайдерах в Android можно прочитать в соответствующей документации.
Как и в стандартном случае, вы должны описать ваш контент-провайдер в манифесте AndroidManifest.xml приложения
<provider android:name=".MyProvider"
android:authorities=".content"
android:exported="false"/>
В этом примере класс MyProvider
должен реализовывать абстрактный класс android.content.ContentProvider
. Вы можете не реализовывать методы insert
, delete
и update
, т.к. провайдер будет использоваться ассистентом только для загрузки данных для формирования паттерна.
Примером паттерна, использующего такой контент-провайдер, может быть такой вариант
<pattern name="MyPattern" uri="content://com.example.content/mypattern"/>
Загрузка происходит при каждом запросе пользователя, который соответствует паттерну команды, использующему данный динамический паттерн.
Метод getType
должен возвращать требуемый тип для паттерна.
mobi.voiceassistant.base.AgentContract.Content.KEY_VALUE_TYPE
означает, что все элементы являются простыми и должны матчиться "как есть"mobi.voiceassistant.base.AgentContract.Content.FUZZY_KEY_VALUE_TYPE
означает, что для матчинга такого паттерна необходимо использовать нечёткий поиск (например, окончания слов могут меняться)Этот метод должен возвращать Cursor
, содержащий пары ключ-значение для всех элементов паттерна. Как правило, для этого используется курсор MatrixCursor
. Каждая строка курсора должна содержать только две колонки:
mobi.voiceassistant.base.AgentContract.Content.COLUMN_ID
- ключ для элемента паттерна; он будет возвращён в токене в поле value
mobi.voiceassistant.base.AgentContract.Content.COLUMN_VALUE
- само текстовое значение, которое будет матчиться по правилу, описанному методом getType
вашего контент-провайдера.Следует помнить, что контент-провайдеры загружают данные всякий раз, когда матчится паттерн, а значит провайдер должен загружать небольшое количество данных и сам процесс загрузки не должен занимать длительное время.
Как правило, контент-провайдеры используются для получения данных, хранящихся локально на устройстве (базы данных, SharedPreferences и т.п.), либо на устройствах в высокоскоростной локальной интранет-сети.
Для использования больших объёмов данных, которые могут храниться на удалённых серверах, необходимо использовать аннотатор, URL которого можно указать в том же атрибуте uri
. При матчинге текста матчер делает запрос на такой сервер, который возвращает дополнительные данные о сущностях, которые он смог отыскать в строке. Таким образом, сервер аннотатора используется как поисковая система, способная работать с большими объёмами данных и языковыми сущностями.
Таким образом, к примеру, работают сервисы "Кино" или "Спорт" в приложении "Ассистент на русском". Для этих сервисов на серверах хранятся названия всех фильмов, кинотеатров, спортивных клубов и имён всех спортсменов.
В данном версии руководства не описывается способ использования аннотаторов при разработке стороннего приложения. Данный функционал будет описан в следующих версиях документации API.