当前位置: 首页 > 手机 > 正文

用蓝牙耳机启动讯飞语点,可自动亮屏自动解锁

[2013-3-29]自动解锁完美!!
[2013-3-28]在黑色主题基础上增加自动亮屏自动解锁功能!!
[2013-3-26]新增黑色主题修改,适合在车上长期开屏使用

安卓系统自带的语音拨号器对于国人来说完全是摆设,我试着说E文拨打自己的号码,不管是dial还是call,成功率不到20%,口音实在太烂,号码念到一半还要想半天,11位号码从中文思维转换为英文还要瞬间从嘴里蹦出来,当年的英语4级根本扛不住……
在车上用蓝牙最麻烦的还是拨号,讯飞语点不错,在桌面创建的讯飞麦克风挺好用,就是每次按下蓝牙耳机的拨号键,系统弹出的都是那个谷歌语音拨号器,讯飞也没有相关设置。于是,apktool再次被拿出来。修改很简单,人人都会:
1. 反编译:apktool d xunfei.apk xunfei
2. 记事本打开 xunfeiAndroidManifest.xml,查找

  1. <action android:name=”android.intent.action.SEARCH_LONG_PRESS” />

复制代码

换行,加上

  1. <action android:name=”android.intent.action.VOICE_COMMAND” />

复制代码

3. 保存
4. 编译:apktool b xunfei xunfei-mod.apk
5. 签名:signapk.bat xunfei-mod.apk xunfei-mod-sign.apk

最后得到的文件 xunfei-mod-sign.apk 就是修改好的讯飞语点,支持蓝牙耳机拨号键启动。安装修改后的讯飞因为签名不一样,不支持原版升级,如果有新版本,再如法炮制得到修改版。

正常的话,安装好之后,按下蓝牙耳机拨号键,会弹出选择窗,允许你选择启动“语音拨号器”,还是“讯飞”,但是有的ROM下不会弹出选择框,总是缺省运行“语音拨号器”,解决办法:系统设置-应用-全部-语音拨号器-停用。然后再按下蓝牙耳机拨号键,就可以看到弹出选择窗口。

以上操作在4.2.2ROM下测试成功。以上用到的工具自行放狗搜。

本来还做了自动点亮屏幕、自动解锁的修改,但是效果不理想(有时候会出现启动了讯飞语点但是不显示窗口),所以没有放上来。


1. 修改好的讯飞语点(原主题界面,非自动解锁):
<ignore_js_op> mod-manifest-sign.apk (11.77 MB)


2. 黑色主题版本(非自动解锁):
<ignore_js_op> mod-manifest-dark-s.apk (11.78 MB)

<ignore_js_op>Screenshot_2013-03-26-17-22-36.jpg


3. 黑色主题,自动亮屏和自动解锁的版本【2013-03-30更新】
在讯飞主界面也可按下蓝牙键弹出语音输入窗。

<ignore_js_op> mod2-s.apk (11.78 MB)

测试环境:Galaxy Nexus 4.2.2 + Bose Bluetooth headset series 2,其它机型未测试。


以下内容是纯技术,没兴趣的不要看

如何给讯飞增加自动亮屏、自动解锁功能:
1. 增加一个Activity:把附件解压放到讯飞反编译后的目录下,smalicomiflytekviaflyuimodelactivity
<ignore_js_op> start_voice.rar (2.76 KB)
这个Activity用来响应蓝牙按键的按下动作,然后亮屏、解锁,启动一个后台线程,后台线程验证屏幕是否真的亮了、真的解锁了,然后启动语点麦克风界面,并且检查是否闪退,如果闪退,则重新启动语点麦克风。

2. 修改AndroidManifest.xml,使用前文写的那一招用来启动我们新增的Activity(前文写的那个修改就不用做了)

  1. <activity android:label=”@string/home_mic_name” android:launchMode=”singleTask” android:name=”com.iflytek.viafly.ui.model.activity.start_voice”>
  2.             <intent-filter>
  3.                 <action android:name=”android.intent.action.VOICE_COMMAND” />
  4.                 <category android:name=”android.intent.category.DEFAULT” />
  5.             </intent-filter>
  6.         </activity>

复制代码

3. 修改SpeechDialog.smali
增加一个成员变量

  1. .field private mResumeTime:J

复制代码

重载onResume函数

  1. .method protected onResume()V
  2.     .locals 5
  3.     invoke-super {p0}, Lcom/iflytek/viafly/ui/model/activity/WaitingSkinBaseDialog;->onResume()V
  4.     #保存当前时间,在onPause中比较,如果相差小于1秒,则重新加载SpeechDialog
  5.     invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
  6.     move-result-wide v3
  7.     iput-wide v3, p0, Lcom/iflytek/viafly/ui/model/activity/SpeechDialog;->mResumeTime:J
  8.     return-void
  9. .end method

复制代码

修改onPause函数

  1. .method protected onPause()V
  2.     .locals 10
  3.     #qlg 2013-03-26
  4.     #解决自动解锁后又马上锁屏的问题
  5.     #保存当前时间,在onPause中比较,如果相差小于1秒,则
  6.     invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
  7.     move-result-wide v4
  8.     iget-wide v6, p0, Lcom/iflytek/viafly/ui/model/activity/SpeechDialog;->mResumeTime:J
  9.     #v2 = currentTime – mResumeTime
  10.     sub-long v2, v4, v6
  11.     #1000ms
  12.     const-wide/32 v0, 0x3e8
  13.     #v8 = compare(1000, v2)
  14.     cmp-long v8, v0, v2
  15.     const v0, 0x0
  16.     #if compare(1000, v2) < 0 then cond_0
  17.     if-lt v8, v0, :cond_0
  18.     #如果小于1000ms,则认为是不明原因导致onPause,重新reStart
  19.     #NeedRestart=1
  20.     const/4 v0, 0x0
  21.     const-string v1, “viaflyStartSpeechDialog”
  22.     invoke-virtual {p0, v1, v0}, Lcom/iflytek/viafly/ui/model/activity/SpeechDialog;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;
  23.     move-result-object v2
  24.     invoke-interface/range {v2 .. v2}, Landroid/content/SharedPreferences;->edit()Landroid/content/SharedPreferences$Editor;
  25.     move-result-object v3
  26.     const-string v4, “NeedRestart”
  27.     const/4 v5, 0x1
  28.     invoke-interface {v3, v4, v5}, Landroid/content/SharedPreferences$Editor;->putInt(Ljava/lang/String;I)Landroid/content/SharedPreferences$Editor;
  29.     invoke-interface/range {v3 .. v3}, Landroid/content/SharedPreferences$Editor;->commit()Z
  30.     :cond_0
  31.     const-string v0, “ViaFly_SpeechDialog”
  32.     const-string v1, “————>> onPause()”
  33.     invoke-static {v0, v1}, Lwy;->d(Ljava/lang/String;Ljava/lang/String;)I
  34.     invoke-super {p0}, Lcom/iflytek/viafly/ui/model/activity/WaitingSkinBaseDialog;->onPause()V
  35.     invoke-virtual {p0}, Lcom/iflytek/viafly/ui/model/activity/SpeechDialog;->finish()V
  36.     return-void
  37. .end method

复制代码

修改SpeechDialog.smali的目的是检查闪退(如果在1秒之内先onResume然后又onPause,则认为是闪退,做一个标记,让后台线程检查到该标记然后重新试图加载语点麦克风界面)

转自:http://bbs.gfan.com/forum.php?mod=viewthread&tid=5975105

本文固定链接: http://cyq.me/1362 | 春与秋

该日志由 cyq 于2013年04月02日发表在 手机 分类下, 通告目前不可用,你可以至底部留下评论。
原创文章转载请注明: 用蓝牙耳机启动讯飞语点,可自动亮屏自动解锁 | 春与秋

用蓝牙耳机启动讯飞语点,可自动亮屏自动解锁:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter