辅助功能给文本框追加文字

一.写一个类并继承类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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值