ブログ投稿で問題を解決する方法を要約しようとしました。助けが必要な人は誰でもそれを調べることができます。
次のレベルへのアクセシビリティ サービス
ブログへのリンクを投稿したばかりのため、以前の回答がモデレーターによって削除された可能性があります。そのため、ここにも詳細を記載して回答を再度投稿しています。
最も簡単な方法は、Android 自体によって提供されます。独自のアプリで何かを構築している場合、これが最善かつ最も簡単な方法です。以下で説明するように、「findAccessibilityNodeInfosByViewId ()」を使用する必要があります。
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
AccessibilityNodeInfo source = event.getSource();
if (source == null) {
return;
}
List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId = source.findAccessibilityNodeInfosByViewId("YOUR PACKAGE NAME:id/RESOURCE ID FROM WHERE YOU WANT DATA");
if (findAccessibilityNodeInfosByViewId.size() > 0) {
AccessibilityNodeInfo parent = (AccessibilityNodeInfo) findAccessibilityNodeInfosByViewId.get(0);
// You can also traverse the list if required data is deep in view hierarchy.
String requiredText = parent.getText().toString();
Log.i("Required Text", requiredText);
}
}
他のアプリで何かを構築していて、res id がわからない場合。親、子の数、データが見つかるレベル、イベントの種類を組み合わせてロジックを構築する必要があります。必要なデータを貴重に取得するには、イベントまたはソースのパターン、または上記の値の組み合わせを探す必要があります。さらに、タスクに応じて正確なデータを取得するには、コードを微調整する必要があります。私たちのタスクのように、貴重なデータを取得するための正規表現があります。
ビューまたは UI が変更された場合、または res id が変更された場合、現在のロジックが失敗する可能性があることに注意する必要があります。そのため、サービスを構築しているアプリを注意深く観察する必要があります。以下は、res id なしでデータを取得するコードの例です。これは、それがどのように機能するかを理解するのに役立ちます。
ソースとイベントを印刷するには
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
AccessibilityNodeInfo source = event.getSource();
if (source == null) {
return;
}
Log.i("Event", event.toString() + "");
Log.i("Source", source.toString() + "");
}
childcount を取得するには
source.getChildCount();
子の数が 0 より大きい場合は、調べる必要があるかもしれません。
コード例 1
if (level == 0 && source.getClassName().equals("android.widget.TextView") && source.getText()!=null && !source.getText().toString().isEmpty()){
// here level is iteration of for loop
String recivedText = source.getText().toString();
if(source.getClassName().equals("android.widget.TextView") && source.getParent()!=null && source.getParent().getClassName().equals("android.widget.FrameLayout") && source.getParent().getParent()==null){
return recivedText;
}
}
コード例 2
if (source.getPackageName().equals("PACKAGE NAME OF APP FOR WHICH YOUR EXPECTING EVENT")) {
if(event.getEventType()==AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && "COMPLETE NAME OF ACTIVITY CLASS WITH PACKAGE NAME (if you want it for some specific screen)".equals(event.getClassName())){
if(source.getText()!=null && source.getClassName().equals("android.widget.TextView") && source.getParent()!=null && source.getParent().getClassName().equals("android.widget.RelativeLayout")&& source.getParent().getParent()!=null && source.getParent().getParent().getClassName().equals("android.widget.ScrollView") && source.getParent().getParent().getParent()!=null && source.getParent().getParent().getParent().getClassName().equals("android.support.v4.view.ViewPager")&& source.getParent().getParent().getParent().getParent()!=null && source.getParent().getParent().getParent().getParent().getClassName().equals("android.widget.FrameLayout")&& source.getParent().getParent().getParent().getParent().getParent()==null){
return source.getText().toString();
}
}
少し不器用ですが、機能させるには、ログを深く調べて、必要なデータに到達するパターンを見つける必要があります。
2017 年 11 月 20 日更新
Google は、アクセシビリティ以外の目的でアクセシビリティ サービスを使用しているすべてのアプリを停止しています。私のアプリの 1 つについて同じメールを受け取りましたが、他の開発者も Google ( Reddit ) から同じメールを受け取っています。したがって、他の方法を探す必要があると思います。ここでも更新してください。同じ動作を実現するために他の実装を思いついた場合は、他の人にも役立つでしょう。
ありがとうウメシュ・チャウハン