この質問は、AndroidTalkbackがアクティブかどうかを知る方法を尋ねました。それはジェリービーンズまで機能しました。Android 4.1以降、上記のカーソルが空であるため、この手順は機能しなくなりました。
そうは言っても、JellyBeanで同じチェックを行う方法があるかどうかを尋ねたいと思います。
編集 TalkBackコードを検索しようとしましたが、ここで見つかりました。TalkBackがアクティブかどうかを確認するために、次のコードを使用しています。
Intent screenReaderIntent = new Intent("android.accessibilityservice.AccessibilityService");
screenReaderIntent.addCategory("android.accessibilityservice.category.FEEDBACK_SPOKEN");
List<ResolveInfo> screenReaders = getPackageManager().queryIntentServices(screenReaderIntent, 0);
Cursor cursor = null;
ContentResolver cr = getContentResolver();
for (ResolveInfo screenReader : screenReaders) {
cursor = cr.query(Uri.parse("content://" + screenReader.serviceInfo.packageName
+ ".providers.StatusProvider"), null, null, null, null);
//here, cursor is not null, but calling cursor.moveToFirst() returns false, which means the cursor is empty
}
そうは言っても、カーソルが空の場合、TalkBackが実行されているかどうかをどのように知ることができますか?
編集2 @JoxTraexの提案に従って、TalkBackが有効になっているかどうかを問い合わせるためにブロードキャストを送信しています。
Intent i = new Intent();
i.setAction("com.google.android.marvin.talkback.ACTION_QUERY_TALKBACK_ENABLED_COMMAND");
sendBroadcast(i);
では、どのように応答を受け取る必要がありますか?
マニフェストに次を追加しようとしましたが、受信者が応答を受け取りません。
<receiver android:name="my.package.MyBroadcastReceiver"
android:permission="com.google.android.marvin.talkback.PERMISSION_SEND_INTENT_BROADCAST_COMMANDS_TO_TALKBACK">
<intent-filter>
<action android:name="com.google.android.marvin.talkback.ACTION_QUERY_TALKBACK_ENABLED_COMMAND" />
</intent-filter>