web-dev-qa-db-ja.com

Android TalkBackがアクティブかどうかを知る方法は?

TalkBackを使用してユーザーをガイドするアプリケーションを開発しています。ただし、そのような状況では、アプリケーションのレイアウトに微妙な違いがあるため、ナビゲーションが簡単になり、ユーザーをガイドするのに役立つ追加の音声出力(TextToSpeechを使用)も必要になります。

私の問題は、ユーザーがTalkBackをアクティブにしている場合にのみ、これらの変更と追加の出力が必要なことです。

それがそうであるかどうかを知る方法はありますか? TalkBack設定に直接アクセスするための特別なものは何も見つかりませんでしたが、必要なものを教えてくれる一般的な電話設定にアクセスする何らかの形があることを望んでいました。

よろしくお願いいたします。

28
David Carvalho

例として、 Eyes-Free ShellアプリケーションのHomeLauncher.Javaファイルグループスレッド 経由)のisScreenReaderActive()を見てください。

要約すると、インテントを使用してすべてのスクリーンリーダーを検出し、それぞれのステータスプロバイダーにクエリを実行して、アクティブかどうかを確認します。

本当にTalkBackのみに制限したい場合は、queryIntentServices()から返された各結果のResolveInfo.serviceInfo.packageNameをチェックして、TalkBackパッケージと一致するかどうかを確認してください。

4
Mike

Novodaは、このチェックを行う accessibilitools というライブラリをリリースしました。アクセシビリティマネージャにクエリを実行して、「音声フィードバック」フラグをサポートするアクセシビリティサービスが有効になっているかどうかを確認します。

AccessibilityServices services = AccessibilityServices.newInstance(context);
services.isSpokenFeedbackEnabled();
6
ataulm

私にとって、私はこの問題をこのように解決しました、それは私のプロジェクトでうまく機能します:

  1. getEnabledAccessibilityServiceList()を使用して、すべてのユーザー補助サービスを取得します。ステータスが開いているサービスがこのリストに含まれます。
  2. トークバックにはcom.Android.talkback.TalkBackPreferencesActivityという名前のアクティビティが含まれています。リストをトラバースして、トークバックサービスが開いているかどうかを確認できます

以下の詳細なコード:

    private static final String TALKBACK_SETTING_ACTIVITY_NAME = "com.Android.talkback.TalkBackPreferencesActivity";

    public static boolean accessibilityEnable(Context context) {
        boolean enable = false;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            try {
                AccessibilityManager manager = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
                List<AccessibilityServiceInfo> serviceList = manager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN);
                for (AccessibilityServiceInfo serviceInfo : serviceList) {
                    String name = serviceInfo.getSettingsActivityName();
                    if (!TextUtils.isEmpty(name) && name.equals(TALKBACK_SETTING_ACTIVITY_NAME)) {
                        enable = true;
                    }
                }
            } catch (Exception e) {
                if (Logging.isDebugLogging()) {
                    e.printStackTrace();
                }
            }
        }
        return enable;
}
1
David Z
    AccessibilityManager am = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
    if (am != null && am.isEnabled()) {
        List<AccessibilityServiceInfo> serviceInfoList = am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN);
        if (!serviceInfoList.isEmpty())
            return true;
    }
    return false;
1
alexbtr