TalkBackを使用してユーザーをガイドするアプリケーションを開発しています。ただし、そのような状況では、アプリケーションのレイアウトに微妙な違いがあるため、ナビゲーションが簡単になり、ユーザーをガイドするのに役立つ追加の音声出力(TextToSpeechを使用)も必要になります。
私の問題は、ユーザーがTalkBackをアクティブにしている場合にのみ、これらの変更と追加の出力が必要なことです。
それがそうであるかどうかを知る方法はありますか? TalkBack設定に直接アクセスするための特別なものは何も見つかりませんでしたが、必要なものを教えてくれる一般的な電話設定にアクセスする何らかの形があることを望んでいました。
よろしくお願いいたします。
例として、 Eyes-Free ShellアプリケーションのHomeLauncher.Javaファイル ( グループスレッド 経由)のisScreenReaderActive()
を見てください。
要約すると、インテントを使用してすべてのスクリーンリーダーを検出し、それぞれのステータスプロバイダーにクエリを実行して、アクティブかどうかを確認します。
本当にTalkBackのみに制限したい場合は、queryIntentServices()
から返された各結果のResolveInfo.serviceInfo.packageName
をチェックして、TalkBackパッケージと一致するかどうかを確認してください。
Novodaは、このチェックを行う accessibilitools というライブラリをリリースしました。アクセシビリティマネージャにクエリを実行して、「音声フィードバック」フラグをサポートするアクセシビリティサービスが有効になっているかどうかを確認します。
AccessibilityServices services = AccessibilityServices.newInstance(context);
services.isSpokenFeedbackEnabled();
私にとって、私はこの問題をこのように解決しました、それは私のプロジェクトでうまく機能します:
以下の詳細なコード:
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;
}
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;