たとえば、スイッチ、スキャン、ヘッド トラッキングなどを使用して、身体障害を持つ人々がデバイスを制御するためのさまざまな代替手段を提供することを目的とした、Android 用のアクセシビリティ サービスを作成しています。
現在、アプリケーションのインターフェイスで実際のアクションを実行するには、アクセシビリティ API、基本的には AccessibilityNodeInfo.performAction() メソッドを使用します。これはほとんどの場合問題なく機能しますが、いくつかの重要な制限が見つかりました。
- ほとんどのキーボード (IME) は機能しません。Lollipop (API 22) の Google キーボードでのみ成功し、AccessibilityService.getWindows()を使用する必要がありました。API のバージョンが低い場合は、特別なキーボードを開発する必要がありました (最適なソリューションではないことは間違いありません)。
- ほとんどのゲームにはアクセスできません。ドット。AccessibilityNodeInfo ツリーをエクスポートしません。
- Web ナビゲーションは実用的ではありません (スクロールがないなどの問題があります)。
解決策は、別の API を使用してアクションを実行することであり、android.app.UiAutomation が目的に合っているようです。ドキュメントによると、「キーボードやタッチデバイスとのユーザー操作をシミュレートする任意の生の入力イベントを注入することもできます」これは私が探しているものです。ただし、UiAutomation はテスト目的であり (そして、おそらく製品品質のコードの準備ができていない)、おそらく別のデバイスでは同じように動作しない可能性があることは理解しています。また、そのような API は、アプリケーションで使用できる場合、セキュリティ ホールになる可能性があることも理解しています。しかし、AccessibilityNodeInfo.performAction() が同様の「力」を提供することを考えると、アクセシビリティ サービスが UiAutomation を使用できるようにすることは妥当と思われます。
そこで、アクセシビリティ サービス内で次のことを試しました。
Instrumentation i = new Instrumentation();
UiAutomation automation = i.getUiAutomation();
しかし、getUiAutomation() は常に null を返します。
ユーザー補助サービス内で UiAutomation (または同様の API) を使用するオプションはありますか?
ところで: デバイスのルート化はオプションではないため、スクリーン ドライバーを介してイベントを挿入することはできません。