问题
I am developing an Android app, where I have to send text to focused EditText
field of other Applications.
I have done it in API level 18
and above using AccessibilityService
, when I find the EditText
, I paste the data from ClipBoard. Here is the code,
public class TestService extends AccessibilityService {
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
AccessibilityNodeInfo source = event.getSource();
if (source != null && event.getEventType() == AccessibilityEvent.TYPE_VIEW_CLICKED && event.getClassName().equals("android.widget.EditText")) {
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", "TEST DATA");
clipboard.setPrimaryClip(clip);
source.performAction(AccessibilityNodeInfo.ACTION_PASTE);
}
}
}
But, AccessibilityNodeInfo.ACTION_PASTE
is available in API level 18 and above.
Can we achieve the same in API Level < 18 ?
I read in some blogs that it can be done using InputMethodService
, where we create our own keyboard and send text via that soft keyboard. I did not understand much of it...
can someone help me on this.
回答1:
You can use ACTION_PASTE from API 14, but you have to call AccessibilityRecordCompat
and AccessibilityNodeInfoCompat
like there:
AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
AccessibilityNodeInfoCompat source = record.getSource();
source.performAction(AccessibilityNodeInfo.ACTION_PASTE);
回答2:
You could get the view that has the current focus:
public View getCurrentFocus() {
return mWindow != null ? mWindow.getCurrentFocus() : null;
}
And then setting up the text:
editTextObject.setText(CharSequence)
回答3:
Yes you can use AccessibilityNodeInfo even from API 14 and up but ACTION_PASTE you have to use only from Api Level 18. Have a look at http://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo.html
来源:https://stackoverflow.com/questions/23100695/accessibilitynodeinfo-send-text