Как включить Text to Speech / Talkback из другого приложения в Android - PullRequest
0 голосов
/ 03 мая 2018

У меня есть требование к enable или disable опции преобразования текста в речь из моего приложения.
Мы предоставим кнопку для пользователя. Если TTS включен и пользователь нажимает кнопку, TTS отключается, а если TTS отключается, а пользователь нажимает кнопку, TTS включается.

Есть идеи, как мы можем включить / отключить TTS нажатием этой кнопки?
Любая помощь в этом будет оценена ..

Примечание: Это приложение будет подписано как системное приложение.

1 Ответ

0 голосов
/ 24 мая 2018

Я нашел ответ на этот вопрос.
Ответ: Сначала нам нужно выяснить, установлена ​​ли у нас Accessibility Services или нет.

AccessibilityManager am = (AccessibilityManager)(Extension.mainContext.getSystemService(Context.ACCESSIBILITY_SERVICE));
List<AccessibilityServiceInfo> services = am.getInstalledAccessibilityServiceList();  

Вышеуказанные две строки предоставят нам сервисы установки для Accessibility/Talk Back.
После того, как у нас есть сервисы, мы можем включить разрешения, которые мы хотим для этих сервисов. Пожалуйста, посмотрите enableTalkBack() ниже, чтобы увидеть, как это сделать.

Примечание: Для записи в Secure Settings ваше приложение для Android должно быть подписано как системное приложение, поскольку только системные приложения имеют разрешения для записи в безопасные настройки.

public static void enableTalkBack()
{
    try {
         AccessibilityManager am = (AccessibilityManager)(Extension.mainContext.getSystemService(Context.ACCESSIBILITY_SERVICE));
         List<AccessibilityServiceInfo> services = am.getInstalledAccessibilityServiceList();

        if (services.isEmpty()) {
            return;
        }

        AccessibilityServiceInfo service = services.get(0);

        boolean enableTouchExploration = (service.flags
                & AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE) != 0;
        // Try to find a service supporting explore by touch.
        if (!enableTouchExploration) {
            final int serviceCount = services.size();
            for (int i = 1; i < serviceCount; i++) {
                AccessibilityServiceInfo candidate = services.get(i);
                if ((candidate.flags & AccessibilityServiceInfo
                            .FLAG_REQUEST_TOUCH_EXPLORATION_MODE) != 0) {
                    enableTouchExploration = true;
                    service = candidate;
                    break;
                }
            }
        }

        ServiceInfo serviceInfo = service.getResolveInfo().serviceInfo;
        ComponentName componentName = new ComponentName(serviceInfo.packageName, serviceInfo.name);
        String enabledServiceString = componentName.flattenToString();
        ContentResolver resolver = Extension.mainContext.getContentResolver();

        Settings.Secure.putString(resolver, "enabled_accessibility_services", enabledServiceString);
        Settings.Secure.putString(resolver,
                "touch_exploration_granted_accessibility_services",
                enabledServiceString);
        if (enableTouchExploration) {
            Settings.Secure.putInt(resolver, "touch_exploration_enabled", 1);
        }
        Settings.Secure.putInt(resolver, "accessibility_script_injection", 1);
        Settings.Secure.putInt(resolver, "accessibility_enabled", 1);
    }
    catch(Exception e) {
        Log.e("Device", "Failed to enable accessibility: " + e);
    }
}
...