Подтвердить что ты не робот

Как использовать новую функцию Android M "Выбор текста", которая будет предлагаться за пределами вашего приложения?

Фон

Android M представляет новый способ обработки выделенного текста (ссылка здесь), даже вне вашего приложения. Выбор текста можно обрабатывать как таковой:

enter image description here

Я знаю, что можно обрабатывать выделенный текст извне приложения, потому что, если я перейду в веб-браузер (или любое другое место, которое позволяет выбирать текст), я вижу, что я могу использовать приложение "API-демонстрации" для обрабатывать выделенный текст.

Проблема

Я не вижу много информации о том, как это сделать.

Вопрос

  • Что следует добавить в код (и манифест), чтобы иметь возможность обрабатывать выделенный текст вне приложения?
  • Можно ли ограничить выбор текстами определенных типов? Например, предлагаете показывать приложение только в том случае, если тип текста является действительным номером телефона?
4b9b3361

Ответ 1

Во-первых, чтобы прояснить вопрос: на M-эмуляторе, если вы выделите текст, вы увидите новый режим плавающего действия. Если вы нажмете значок переполнения, вы увидите "API DEMOS":

M Developer Preview Emulator

Нажатие этой кнопки вызывает действие из приложения API Demos, отображающее выделенный текст:

Another M Developer Preview Emulator

Замена значения в поле и нажатие кнопки помещает ваш заменяющий текст в качестве замены того, что вы выделили.


ПРЕДУПРЕЖДЕНИЕ. Следующее объяснение - проверка кода API Demos и документации M Developer Preview. Очень возможно, что это изменится до того, как M отправится на разведку. YMMV, если вы не используете метрическую систему, и в этом случае YKMV.

Соответствующая активность, получающая текст, поддерживает ACTION_PROCESS_TEXT как действие Intent. EXTRA_PROCESS_TEXT будет содержать некоторый текст, или EXTRA_PROCESS_TEXT_READONLY будет удерживать его, если текст доступен только для чтения. Действие будет вызываться через startActivityForResult(). Результат Intent может иметь собственное значение EXTRA_PROCESS_TEXT, которое будет заменяющим текстом.

Итак, к конкретным вопросам:

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

См. выше. Обратите внимание, что активность API Demos (ProcessText) имеет этот <intent-filter>:

        <intent-filter >
            <action android:name="android.intent.action.PROCESS_TEXT"/>
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
        </intent-filter>

В документации не рассматривается тип MIME. Я не запускал никаких экспериментов, чтобы определить, нужен ли тип MIME, и что еще мы можем получить (text/html для вещей, имеющих пробелы?).

Можно ли ограничить выбор определенных типов текстов? Например, предлагаете показывать приложение только в том случае, если тип текста является действительным номером телефона?

Это не представляется возможным с учетом документации. При этом, конечно, разумная идея (например, рекламировать регулярное выражение или несколько регулярных выражений через метаданные в манифесте, что текст должен соответствовать).

Ответ 2

Эта статья в блоге разработчиков Android может быть уместной, в ней описывается, как опция Google Translate может быть добавлена ​​в меню выбора текста переполнения.

Android-приложения, использующие поведение выбора текста Android, уже будут эта функция включена, поэтому никаких дополнительных шагов не требуется. Разработчики, которые создали пользовательский стиль для выбора текста для своих приложений может легко реализовать эту функцию, выполнив следующие шаги:

Сканирование через PackageManager через все пакеты, которые имеют PROCESS_TEXT фильтр намерения (например: com.google.android.apps.translate - если он установлен) и добавить их как MenuItems в параметры TextView для вашего приложения

Чтобы запросить менеджера пакетов, сначала создайте намерение с действием Intent.ACTION_PROCESS_TEXT, затем получить поддерживаемые действия и добавить элемент для каждой полученной деятельности и приложить к ней намерение для запуска действия

public void onInitializeMenu(Menu menu) {
    // Start with a menu Item order value that is high enough
    // so that your "PROCESS_TEXT" menu items appear after the
    // standard selection menu items like Cut, Copy, Paste.
    int menuItemOrder = 100;
    for (ResolveInfo resolveInfo : getSupportedActivities()) {
        menu.add(Menu.NONE, Menu.NONE,
                menuItemOrder++,
                getLabel(resolveInfo))
            .setIntent(createProcessTextIntentForResolveInfo(resolveInfo))
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    }
}