一.写一个类并继承类AccessibilityService,
粘贴文字:
方法一:
Bundle arguments = new Bundle();
arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "android");
accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
方法二:
ClipboardManager clipboard = (ClipboardManager)this.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("text", "test");
clipboard.setPrimaryClip(clip);
//焦点(n是AccessibilityNodeInfo对象)
accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_FOCUS);
//粘贴进入内容
accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_PASTE);
代码:
package com.voice.recognition;
import android.accessibilityservice.AccessibilityService;
import android.annotation.TargetApi;
import android.app.KeyguardManager;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.os.PowerManager;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Toast;
import java.util.List;
/**
* Created by zjhl on 2017/10/28.
*/
public class AutoReplyService extends AccessibilityService {
private boolean canGet = false;//能否点击红包
private boolean enableKeyguard = true;//默认有屏幕锁
//窗口状态
private static final int WINDOW_NONE = 0;
private static final int WINDOW_LAUNCHER = 3;
//当前窗口
private int mCurrentWindow = WINDOW_NONE;
//锁屏、解锁相关
private KeyguardManager km;
private KeyguardManager.KeyguardLock kl;
//唤醒屏幕相关
private PowerManager pm;
private PowerManager.WakeLock wl = null;
private boolean isInstall;
private boolean isUnInstall;
//唤醒屏幕和解锁
private void wakeAndUnlock(boolean unLock) {
if (unLock) {
//若为黑屏状态则唤醒屏幕
if (!pm.isScreenOn()) {
//获取电源管理器对象,ACQUIRE_CAUSES_WAKEUP这个参数能从黑屏唤醒屏幕
wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "bright");
//点亮屏幕
wl.acquire();
}
//若在锁屏界面则解锁直接跳过锁屏
if (km.inKeyguardRestrictedInputMode()) {
//设置解锁标志,以判断抢完红包能否锁屏
enableKeyguard = false;
//解锁
kl.disableKeyguard();
}
} else {
//如果之前解过锁则加锁以恢复原样
if (!enableKeyguard) {
//锁屏
kl.reenableKeyguard();
}
//若之前唤醒过屏幕则释放之使屏幕不保持常亮
if (wl != null) {
wl.release();
wl = null;
}
}
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
int eventType = event.getEventType();
System.out.println("onAccessibilityEvent..............................." + eventType);
switch (eventType) {
//第一步:监听通知栏消息
case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
System.out.println("onAccessibilityEvent.......................................TYPE_NOTIFICATION_STATE_CHANGED.");
break;
//第二步:监听是否进入apk安装界面
case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
System.out.println("TYPE_WINDOW_STATE_CHANGED...............................");
//检测信息这个应用程序
if ("com.android.mms".equalsIgnoreCase(event.getPackageName().toString()) || "com.baidu.searchbox".equalsIgnoreCase(event.getPackageName().toString())) {
System.out.println("监测到信息的应用程序.....................");
AccessibilityNodeInfo rootNode = getRootInActiveWindow();
if (rootNode != null) {
//查找到聚焦的文本
AccessibilityNodeInfo accessibilityNodeInfo = rootNode.findFocus(AccessibilityNodeInfo.FOCUS_INPUT);
boolean isFocuse = accessibilityNodeInfo.isFocused();
System.out.println("isFocuse..............................." + isFocuse);
System.out.println("accessibilityNodeInfo.getClassName()..............................." + accessibilityNodeInfo.getClassName());
// Bundle arguments = new Bundle();
// arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "android");
// accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
ClipboardManager clipboard = (ClipboardManager)this.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("text", "15066306736");
clipboard.setPrimaryClip(clip);
//焦点(n是AccessibilityNodeInfo对象)
accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_FOCUS);
粘贴进入内容
accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_PASTE);
}
}
break;
case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:
System.out.println("onAccessibilityEvent.......................................TYPE_WINDOW_CONTENT_CHANGED");
//检测信息这个应用程序
if ("com.android.mms".equalsIgnoreCase(event.getPackageName().toString()) || "com.baidu.searchbox".equalsIgnoreCase(event.getPackageName().toString())) {
System.out.println("监测到信息的应用程序.....................");
AccessibilityNodeInfo rootNode = getRootInActiveWindow();
if (rootNode != null) {
//查找到聚焦的文本
AccessibilityNodeInfo accessibilityNodeInfo = rootNode.findFocus(AccessibilityNodeInfo.FOCUS_INPUT);
boolean isFocuse = accessibilityNodeInfo.isFocused();
System.out.println("isFocuse..............................." + isFocuse);
System.out.println("accessibilityNodeInfo.getClassName()..............................." + accessibilityNodeInfo.getClassName());
// Bundle arguments = new Bundle();
// arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "android");
// accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
ClipboardManager clipboard = (ClipboardManager)this.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("text", "15066306736");
clipboard.setPrimaryClip(clip);
//焦点(n是AccessibilityNodeInfo对象)
accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_FOCUS);
粘贴进入内容
accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_PASTE);
}
}
break;
}
}
@Override
protected void onServiceConnected() {
super.onServiceConnected();
//获取电源管理器对象
pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
//得到键盘锁管理器对象
km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
//初始化一个键盘锁管理器对象
kl = km.newKeyguardLock("unLock");
Toast.makeText(this, "_已开启应用自动安装服务_", Toast.LENGTH_LONG).show();
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("demo", "关闭");
wakeAndUnlock(false);
Toast.makeText(this, "_已关闭应用自动安装服务_", Toast.LENGTH_LONG).show();
}
}
二、在res的xml文件夹中新建一个文件auto_reply_service_config.xml,在packageNames中加入所需要监测的应用的名字,com.android.mms是短信的包名
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100"
android:packageNames="com.android.packageinstaller,com.android.mms.service,com.android.mms,com.baidu.searchbox"
/>
三、在Mainfest文件中进行注册
<service
android:name=".AutoReplyService"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/auto_reply_service_config"/>
</service>
四、在手机的辅助功能中开启辅助功能VoiceRecognition
五、运行结果
将文字自动放在了已聚焦的文本框里面
注:参考资料:http://www.it1352.com/146874.html
https://q.cnblogs.com/q/77637/
https://stackoverflow.com/questions/15557902/set-text-in-accessibilitynodeinfo
http://blog.csdn.net/bsmmaoshenbo/article/details/52415620