Android 输入法 微信公众号搜索定制版
1. 一个简单的Android 输入法
(1) 使用Android Studio建立一个没有Activity的项目,对于一个简单的输入法而言,MainActivity并不是必要的,只需要一个输入法服务即可。因此,该项目mainfest.xml文件可以如下定义:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.elk_show.androidxxime"><!--这里写android版本控制信息--><uses-sdk
android:minSdkVersion="17"android:targetSdkVersion="22" /><!--这里定义具体的application--><application
android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name" android:supportsRtl="true"android:theme="@style/AppTheme"><!--这里定义具体的service--><service android:name=".AndroidXXIME"android:label="@string/xxime"android:permission="android.permission.BIND_INPUT_METHOD"><intent-filter><action android:name="android.view.InputMethod" /></intent-filter><!--创建一个能够匹配android.view.InputMethod的intent filter--><meta-data android:name="android.view.im" android:resource="@xml/method"/></service><!-- ATTENTION: This was auto-generated to add Google Play services to your project forApp Indexing. See https://g.co/AppIndexing/AndroidStudio for more information. --><meta-data
android:name="com.google.android.gms.version"android:value="@integer/google_play_services_version" /></application>
<!--application块的尾部添加IME service的声明-->
</manifest>
(2) mainfest.xml文件中使用到了资源文件xml/method,我们需要在res目录下创建一个文件夹xml,在该文件夹下创建method.xml文件,该文件中包含了输入法的subtype属性,输入法通过该属性定义它所支持的输入模式和语言,一个输入法可以包含多个subtype属性。
<?xml version="1.0" encoding="utf-8"?>
<input-method xmlns:android="http://schemas.android.com/apk/res/android"><subtype
android:label="@string/subtype_zh_CN"android:imeSubtypeLocale="zh_CN"android:imeSubtypeMode="keyboard" />
</input-method>
对于一个subtype:
label是该subtype的名字
imeSubtypeLocale是该subtype支持的语言类型
imeSubtypeMode是它所支持的模式,可以是keyboard或者voice,当输入法被调起是,系统会把用户选择的mode值传给输入法。这里,我们只有一个subtype,效果并不明显。
(3) method.xml中的@string字符串保存在string.xml中,该文件在res/values目录下,我们需要对其做修改:
<resources><string name="app_name">AndroidXXIME</string><string name="xxime">XXIME</string><string name="subtype_zh_CN">中文</string>
</resources>
xxime在manifest中定义service的android:label时被引用到,该字串用来显示系统“语言和输入法”中本输入法的名字:
(4) 键盘布局
这个简单的键盘中,我们只需要4个按键:
- INPUT :输入内容
- create database :建立保存内容的数据库
- delete database: 清空数据库
- DONE : 执行搜索
在res/layout/中添加文件keyboard.xml,定义键盘布局,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<android.inputmethodservice.KeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/keyboard"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:keyPreviewLayout ="@layout/preview"android:singleLine="true"android:imeOptions="actionGo|actionSearch"/>
其中keyPreviewLayout表示键盘被按下时的布局资源。在res/layout中添加preview.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:background="#ffff00"android:textStyle="bold"android:textSize="30sp">
</TextView>
(5) 按键信息定义在qwerty.xml文件中,该文件保存在res/xml目录下:
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"android:keyWidth="10%p"android:horizontalGap="0px"android:verticalGap="0px"android:keyHeight="60dp"><Row><Key android:codes="105" android:keyLabel="INPUT" android:keyWidth="20%p" android:keyEdgeFlags="left"/><Key android:codes="-5" android:keyLabel="create database" android:keyWidth="30%p" android:isRepeatable="true"/><Key android:codes="32" android:keyLabel="delete database" android:keyWidth="30%p" android:isRepeatable="true"/><Key android:codes="-4" android:keyLabel="DONE" android:keyWidth="20%p" android:keyEdgeFlags="right"/></Row>
</Keyboard>
Row表示一行,内部又包含Key表示一个按键,每个按键有两个必填属性:
· keyLabel:按键上显示的文字
· codes:该按键代表的Unicode码
我们定义的键盘布局如下图所示:
(6) input服务创建
AndroidXXIME类扩展了InputMethodService,并实现了KeyboardView.OnKeyboardActionListener接口。该类的定义如下:
public class AndroidXXIME extends InputMethodServiceimplements KeyboardView.OnKeyboardActionListener {private KeyboardView keyboardView; // 对应keyboard.xml中定义的KeyboardViewprivate Keyboard keyboard; // 对应qwerty.xml中定义的Keyboard@Overridepublic void onPress(int primaryCode) {}@Overridepublic void onRelease(int primaryCode) {}@Overridepublic void onText(CharSequence text) {}@Overridepublic void swipeDown() {}@Overridepublic void swipeLeft() {}@Overridepublic void swipeRight() {}@Overridepublic void swipeUp() {}@Overridepublic View onCreateInputView() {// keyboard被创建后,将调用onCreateInputView函数keyboardView = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null); // 此处使用了keyboard.xmlkeyboard = new Keyboard(this, R.xml.qwerty); // 此处使用了qwerty.xmlkeyboardView.setKeyboard(keyboard);keyboardView.setOnKeyboardActionListener(this);return keyboardView;}private void playClick(int keyCode){// 点击按键时播放声音,在onKey函数中被调用AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE);switch(keyCode){case 32:am.playSoundEffect(AudioManager.FX_KEYPRESS_SPACEBAR);break;case Keyboard.KEYCODE_DONE:case 10:am.playSoundEffect(AudioManager.FX_KEYPRESS_RETURN);break;case Keyboard.KEYCODE_DELETE:am.playSoundEffect(AudioManager.FX_KEYPRESS_DELETE);break;default: am.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD);}}@Overridepublic void onKey(int primaryCode, int[] keyCodes) {InputConnection ic = getCurrentInputConnection();playClick(primaryCode);switch(primaryCode){case Keyboard.KEYCODE_DELETE :ic.deleteSurroundingText(1, 0);break;case Keyboard.KEYCODE_DONE:ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));break;default:char code = (char)primaryCode;ic.commitText(String.valueOf(code), 1);}}
}
以上内容部分参考了:写一个Android输入法01——最简步骤
2. 输入内容的数据库的操作
我们使用资源文件夹res/raw保存我们的输入内容,该文件夹需要自己建立,输入内容的格式如下:
阿坝州
阿东
阿海
阿克苏地区
阿拉蕾
阿拉斯
阿联
……
数据的读取采用InputStreamReader 和 BufferedReader,具体方法如下:
String res="";Resources resources=this.getResources();InputStream is=null;is=resources.openRawResource(R.raw.keywords);InputStreamReader reader = new InputStreamReader(is);BufferedReader breader = new BufferedReader(reader);
数据取到后就存入SQLite数据库中:
private void createDb()throws IOException{String res="";Resources resources=this.getResources();InputStream is=null;Integer i=1;try{is=resources.openRawResource(R.raw.dongjiahua);InputStreamReader reader = new InputStreamReader(is);BufferedReader breader = new BufferedReader(reader);SQLiteDatabase db = openOrCreateDatabase("keywords", Context.MODE_PRIVATE,null);db.execSQL("CREATE TABLE IF NOT EXISTS keyword (id integer primary key autoincrement,word varchar(20),searched varchar(5))");while((res = breader.readLine())!=null){addData(db,i,res,"no");i++;}breader.close();reader.close();db.close();}catch (IOException e){e.getStackTrace();}}
在某些情况下,需要删除数据表重新建立:
SQLiteDatabase db = openOrCreateDatabase("keywords", Context.MODE_PRIVATE,null);
db.execSQL("DROP TABLE IF EXISTS keyword");
db.close();
直接执行sql 命令DROP即可。
3. 从数据库中取数据
private String getKeyword() {SQLiteDatabase db = openOrCreateDatabase("keywords", Context.MODE_PRIVATE,null);String select = "SELECT id,word FROM KEYWORD WHERE searched=?";Cursor c = db.rawQuery(select,new String[]{"no"});String res="";Integer id=0;if(c.getCount()==0){res="no data";}if(c.moveToFirst()){id = c.getInt(0);res = c.getString(1);db.delete("keyword","word=?",new String[]{res});addData(db,id,res,"yes");}db.close();return res;}
每次只取符合条件的第一条记录的相关字段,并将该调用信息写入数据库中,即把“searched”字段由“no”改为“yes”。
4. 重新定义按键功能
改写onKey 方法:
public void onKey(int primaryCode, int[] keyCodes){InputConnection ic = getCurrentInputConnection();playClick(primaryCode);switch(primaryCode){case Keyboard.KEYCODE_DELETE :try{createDb();}catch (IOException e){e.getStackTrace();}break;case Keyboard.KEYCODE_DONE:sendKeyChar('\n');break;case 32:SQLiteDatabase db = openOrCreateDatabase("keywords", Context.MODE_PRIVATE,null);db.execSQL("DROP TABLE IF EXISTS keyword");db.close();default:ic.commitText(getKeyword(), 1);}}
当按下create database 时:通过creatDb 方法建立数据库和数据表,并将数据从raw资源文件中读取到数据表中;
当按下delete database 时:删除数据库中的指定数据表;
当按下INPUT 时:通过getKeyword 方法从数据库中取得一个数据,提交到文本框中;
当按下DONE 时:向文本框中发送字符’\n’,即回车,微信的搜索开始执行。
Android 输入法 微信公众号搜索定制版相关推荐
- android逆向公众号,逆向一款微信公众号搜索工具(技术含量极低)
今天我们来逆向一款52上的微信搜索工具,它的功能如下: 这款软件现在已经无法使用了,但是我们可以通过它能寻找它所调用的API(它到底是如何查到这些信息的),以及了解到它失效的原因. 首先查壳,发现没有 ...
- 黎想首谈微信公众号搜索排名的规则?怎样提高排名?
微信公众号在我国可谓是被用到了极致,下面产品经理黎想将就微信公众号的相关功能技巧发表自己的观点! 微信公众号是开发者或商家在微信公众平台上申请的应用账号,该帐号与QQ账号互通,通过公众号,商家可在微信 ...
- 查找微信公众号服务器,墨涩网 - 免插件实现微信公众号搜索连接wordpress网站文章——墨涩网...
微信公众号当前是每个用户都在使用的功能,而使用wordpress程序的站长会希望把自己的网站连接到微信公众号.连接后通过公众号访问网站的内容. 目前网上有很多可以实现微信公众号和wordpress网站 ...
- 换个方式认识一下——微信公众号搜索公众号列表 API
前往测试接口 onebound.weixin.item_search_seller 公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) secre ...
- 公众号微信支付ios和android,uni-app微信公众号支付和分享,特别是ios下的配置,完美解决...
一.支付 由于在ios中uni-app发布的应用是单应用,不管访问哪个页面,始终记录的是首次进来的那个页面. 这样的话,在微信支付签名时会报签名不对的错误.怎么解决? 老王的解决方案是在main.js ...
- 微信公众号流量入口-搜索排名
随着时代格局的改变,移动应用爆发式增长,微信也迎来了它的时代,而这个流量入口又推出了"微信搜索".那么,"微信搜索"是什么呢?商家可以将他作为抢占微信流量的入口 ...
- Android实现绑定微信公众号,获取相对公众号的唯一openId
Android绑定微信公众号.获取相对公众号的唯一openId 注意:为了识别用户,每个用户针对每个公众号会产生一个安全的OpenID,如果需要在多公众号.移动应用之间做用户共通,则需前往微信开放平台 ...
- 重磅 |“吴恩达deeplearningai”官方微信公众号已经上线!
从去年8月份开始,AI界大IP吴恩达在coursera上开设了由5们课组成的深度学习专项课程,掀起了一股人工智能深度学习热潮.这里附上deeplearning.ai的官网: deeplearning. ...
- 微信公众号数据2019_全国公众号总排名2019,全国微信公众号排名
全国公众号总排名2019,全国微信公众号排名 公众号排名优化的注意事项及细节今天给大家分享一下,作为微信公众号的排名优化对于大多数人来说都已经知道了有这个渠道的事情,其实很多的新产品及渠道出来以后有不 ...
最新文章
- SpringBatch 配置并行启动Job详解 (八)
- java 两个窗口 贴_求助Java窗口菜单如何实现复制粘贴剪切等功能(内附源代码)...
- 公众号H5 VUE获取CODE
- 天线增益英文名称:antenna gain
- slf4j相关的配置信息
- mysql 1539_MySQL:半同步(三)从库端初始化和回调函数
- 全参考视频质量评价方法(PSNR,SSIM)以及相关数据库
- 力扣-面试题 10.05 稀疏数组搜索
- vue项目使用阿里云播放器(aliyun)
- Qt + OpenGL 教程(三):线
- emmet插件及PyV8
- 物联网人工智能软件市场现状研究分析报告 -
- python实例008--摄氏温度和华氏温度转换
- 关于SQLServer连接Oracle数据库时报'链接服务器ORCL的 OLE DB 访问接口 OraOLEDB.Oracle 返回了消息 新事务不能登记到指定的事务处理器中。 。'
- 给div添加蒙版(遮罩?)
- 2019版颱風24、48小時警戒綫(附帶2010版)
- 计算机在现代教育中的作用,现代教育技术的作用
- coffeescript基本语法
- CSDN如何删除上传的资源
- 学习笔记:Java 并发编程①_基础知识入门
热门文章
- 【树莓派】树莓派使用python、E16 GPRS模块向MQTT服务器传输数据
- Android Radio开发——简介(一)
- 27、*(类和对象)现有电视商品价格竞猜活动。 项目需求:随机出现一个商品名,用户猜测它的价值 规定次数4次,猜对便可获得此商品。
- 基于MATLAB的室内可见光调制解调通信系统
- YY 直播GitHub开源项目,霸屏Github排名榜!
- 【openlayer2】清理图层OpenLayers.Layer.WMS
- Vue框架学习(第十三课)Vuex状态管理中的store和state属性
- 不要讨要共享单车押金了,没用
- 盗窃案件办理中的问题及思路
- 2023 物联网毕业设计选题推荐 100例