2016-07-26 11 views
1

AccessibilityServiceを別のアプリケーションのEditTextに貼り付けるには、自分のアプリで使用しています。これは通常のケースで正常に動作しますアクセシビリティNodeInfo.performAction()メソッドが動作しない場合があります

Bundle bundle = new Bundle(); 

bundle.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT, 
      AccessibilityNodeInfo.MOVEMENT_GRANULARITY_WORD); 
bundle.putBoolean(AccessibilityNodeInfo.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN, 
      true); 

eventSource.performAction(AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY, 
      bundle); 

ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("text", stringToCopy); 
clipboard.setPrimaryClip(clip); 

eventSource.performAction(AccessibilityNodeInfo.ACTION_PASTE); 

私は同じことを達成するために、次のコードを使用しています

、。私は

WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 

を使用してAccessibilityServiceからAlertDialogを開き、ダイアログのボタンを押し上で上記のコードを実行したときただし、が異常動作します。

ケース1:罰金作品とテキストは、ダイアログ

ケースから貼り付けます 2:テキストを貼り付けますが、選択がなされていないため、前の単語は、フィールド

ケース3のまま:何も起こらず、ただダイアログが消える。

ただし、すべての場合、テキストはクリップボードにコピーされ、手動で貼り付けることができます。

手がかりはありますか?

答えて

1

私は最終的にそれが動作するようになった、これは

は当初、私はWindowとしてDialogのビューを持っていたとして、競合を引き起こした、同時にDialog.dismiss()AccessibilityNodeInfo.performAction()を呼んでいたか、です現在アクティブなビューであり、AccessibilityNodeにリンクできませんでした。

私は

mDialog.dismiss(); 

new Handler().postDelayed(() -> { 
    Bundle bundle = new Bundle(); 

    bundle.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT, 
      AccessibilityNodeInfo.MOVEMENT_GRANULARITY_WORD); 
    bundle.putBoolean(AccessibilityNodeInfo.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN, 
      true); 

    eventSource.performAction(AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY, 
      bundle); 

    ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); 
    ClipData clip = ClipData.newPlainText("text", stringToCopy); 
    clipboard.setPrimaryClip(clip); 

    eventSource.performAction(AccessibilityNodeInfo.ACTION_PASTE); 
}, 300); 

は、今ではperformAction()Dialogは完全に却下するのに十分な時間を与えるの呼び出しの遅延を提供した後、適切に毎回働き、これに私のコードを変更しました。

関連する問題