本帖最后由 回不去的时光 于 -3-23 22:06 编辑
明明是原创,纯手打,也被移动到分享区,吾爱管理员的脑袋是不是都被门卡过。。。目的:实现三星Bixby在播放音乐时,也可以唤醒语音助手
三星手机软件都是通用的,也就是说三星软件都是一样的,只是在代码里判断机型,隐藏掉一些功能罢了
我今晚要实现一个功能就是: S10在播放音乐时,Bixby语音助手也可以黑屏语音唤醒
分析过程很漫长:
1.首先是拿到三个关键包(一般语音助手也就一个,想不懂三星搞那么多干啥)
Bixby 服务_2.3.02.0
Bixby 语音_2.3.02.0
语音唤醒_2.1.16.16
2.搜索关键词【唤醒】
在res里搜到【即使手机扬声器正在播放铃声、闹钟或媒体音乐,您依旧可以使用语音唤醒 Bixby】
进一步分析到【settings_voice_wakeup_allow_media_option】然后搜索id(没结果)、只能跟踪布局来定位位置
布局:settings_wakeup_preferences.xml
这里布局也没啥给力的button等有关的id可以分析,只能搜关键词【key_set_media_option_voice_command】
3.在Bixby 语音包里来到了
com.samsung.android.bixby.settings.wakeup.VoiceWakeupOptionsFragment
上下文分析下,得到一些比较有用的东西
if (WakeupUtil.isTablet()) {
this.mSetMediaOptionVoiceCommand.setTitle(R.string.settings_use_when_tablet_speaker_playing_title);
description = getString(R.string.settings_use_when_tablet_speaker_playing_summary);
}
this.mSetMediaOptionVoiceCommand.setSummary((CharSequence) description + " " + getString(R.string.settings_voice_wakeup_allow_media_option_message_2));
if (WakeupUtil.isMediaSupported()) {
this.mSetMediaOptionVoiceCommand.setOnPreferenceChangeListener(this);
} else {
removePreference(this.mSetMediaOptionVoiceCommand);
this.mSetMediaOptionVoiceCommand = null;
}
this.mChangeVoiceCommand = findPreference("key_change_voice_command");
if (WakeupUtil.isCustomWakeupSupported(getContext())) {
this.mChangeVoiceCommand.setOnPreferenceClickListener(this);
} else {
Preference pc = findPreference("key_category_wakeup_command");
removePreference(this.mChangeVoiceCommand);
removePreference(pc);
this.mChangeVoiceCommand = null;
}
this.mSetVoiceUnlock = (SwitchPreferenceCompat) findPreference("key_set_unlock_phone_option_voice_command");
setVoiceUnlockSummary();
if (WakeupUtil.isVoiceUnlockSupported(getContext())) {
this.mSetVoiceUnlock.setOnPreferenceChangeListener(this);
return;
}
isVoiceUnlockSupported是否支持语音解锁
isCustomWakeupSupported是否支持自定义唤醒词
我要的播放音乐时,也可以唤醒语音助手就是isMediaSupported
反编译改包是有验证的,不只是签名验证(过掉了),改包后包都起不来,有其他验证,没再去深究
直接写xposed模块,hook这里,顺便实现自定义唤醒词
重启手机,验证效果
4.你以为成功了?
不是的,我们还是太天真了。ui选项是出来了,出现了【在手机扬声器播放时使用】的选项,但是勾选后,退出进来又是没勾选的状态。
来吧,继续跟踪代码分析呗,一直分析这个函数到机型,SM-A505
public static boolean isMediaSupported() {
return 1 != getBargeInConfig();
}
public static int getBargeInConfig() {
int config = SemFloatingFeature.getInstance().getInt("SEC_FLOATING_FEATURE_BIXBY_CONFIG_BARGEIN_FUNCTION", 0);
if (isA50Device()) {
config = 1;
}
LogVoiceFw.d(TAG, "getBargeInConfig:" + config, new Object[0]);
return config;
}
private static boolean isA50Device() {
return Build.MODEL.contains("SM-A505");
}
最终是看到 SEC_FLOATING_FEATURE_BIXBY_CONFIG_BARGEIN_FUNCTION,这是个Feature特征
SemFloatingFeature这个是三星自己的framework的jar包
跟踪无结果,想到以前搞过中兴ZTE语音助手,想起来有个词:双麦克风降噪
在其他bibxy两个包里搜关键词【SEC_FLOATING_FEATURE_BIXBY_CONFIG_BARGEIN_FUNCTION】
在语音唤醒这个包里搜到很关键的函数com.samsung.android.voicewakeup.VoiceWakeupInfoisAecWakeupEnabled 这是回声消除的判断函数了,TAG是VoiceWakeupInfo
如果不支持回声消除的机型,是不能在播放音乐时语音唤醒的,hook,打印原返回值,果然是不支持,强制返真,搞定,测试成功
很晚了,该睡觉了,
其他隐藏功能比如自定义语音唤醒词,甚至别人的语音,直接唤醒解锁手机都可以实现
今晚主要是为了想要一个听音乐可以直接语音换歌,Bixby只支持网易云音乐的操作,明晚再把网易云音乐搞搞,广告太多了,下载还收费。。。