当前位置: 首页 > news >正文

百度图在图不留网站方武冈网站建设哪家好

百度图在图不留网站方,武冈网站建设哪家好,设计网站手机app客户端,搜索热词排名继续研究hfp相关功能。蓝牙耳机可以控制手机接听、拒接、挂断电话#xff0c;拨打电话等功能。本文主要分析下起这些操作的大致流程。在系统应用Bluetooth中com_android_bluetooth.cpp提供了多个回调方法#xff0c;由hardware、协议栈回调过来。蓝牙耳机的一些控制命令都会发…继续研究hfp相关功能。蓝牙耳机可以控制手机接听、拒接、挂断电话拨打电话等功能。本文主要分析下起这些操作的大致流程。在系统应用Bluetooth中com_android_bluetooth.cpp提供了多个回调方法由hardware、协议栈回调过来。蓝牙耳机的一些控制命令都会发到这里。本文基于Android4.3源码。1 接通电话蓝牙耳机控制手机接通电话回掉com_android_bluetooth.cpp中的answer_call_callback()函数该函数主要操作是调用HeadsetStateMachine的onAnswerCall()函数代码如下在onAnswerCall()中发送消息(消息类型STACK_EVENTStackEvent事件类型EVENT_TYPE_ANSWER_CALL)向状体机此时通话尚未接通audio没有连接所以此时处于Connected状态。状态机收到该消息后调用processAnswerCall()函数。processAnswerCall()代码如下private void processAnswerCall() {if (mPhoneProxy ! null) {try {//mPhoneProxy是通过bindservice 获取的。mPhoneProxy.answerCall();} catch (RemoteException e) {}} else {}}初始化的时候会bind service绑定的该service为系统应用Phone下的BluetoothPhoneService(AndroidManifest中该service的action为android.bluetooth.IBluetoothHeadsetPhone)代码如下//参数为android.bluetooth.IBluetoothHeadsetPhoneIntent intent new Intent(IBluetoothHeadsetPhone.class.getName());//resolveSystemService该方法是hide的由系统使用的特殊功能来解决系统应用程序的服务意图。intent.setComponent(intent.resolveSystemService(context.getPackageManager(), 0));if (intent.getComponent() null || !context.bindService(intent, mConnection, 0)) {Log.e(TAG, Could not bind to Bluetooth Headset Phone Service);}绑定service成功回调mConnection在其成功回调中设置的mPhoneProxy。通过mPhoneProxy来调用service中提供的接口。mPhoneProxy.answerCall()跳到BluetoothPhoneService中answerCall。public boolean answerCall() {//申请权限修改电话状态enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, null);return PhoneUtils.answerCall(mCM.getFirstActiveRingingCall());}PhoneUtils调用answerCall在这里面去接通电话。answerCall()就不具体分析了。2 拒接、挂断电话蓝牙耳机控制手机拒接、挂断电话回掉com_android_bluetooth.cpp中的hangup_call_callback()函数该函数主要操作是调用HeadsetStateMachine的onHangupCall()函数代码如下private void onHangupCall() {StackEvent event new StackEvent(EVENT_TYPE_HANGUP_CALL);sendMessage(STACK_EVENT, event);}此时HeadsetStateMachine可能处于Conneted或AudioOn状态这两种状态收到该消息的处理一样都是调用processHangupCall(),代码如下private void processHangupCall() {if (isVirtualCallInProgress()) {//对于虚拟电话结束。terminateScoUsingVirtualVoiceCall();} else {if (mPhoneProxy ! null) {try { //挂断电话mPhoneProxy.hangupCall();} catch (RemoteException e) {}} else {}}}对于虚拟电话则直接将其结束。真实的通话跳到BluetoothPhoneService的hangupCall。public boolean hangupCall() {enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, null);if (mCM.hasActiveFgCall()) { //挂断正在进行的通话return PhoneUtils.hangupActiveCall(mCM.getActiveFgCall());} else if (mCM.hasActiveRingingCall()) { //停止正在响铃的电话return PhoneUtils.hangupRingingCall(mCM.getFirstActiveRingingCall());} else if (mCM.hasActiveBgCall()) { //挂断保持的电话return PhoneUtils.hangupHoldingCall(mCM.getFirstActiveBgCall());}return false;}hangupCall中会根据状态处理通话优先处理正在进行的通话、其次是尚未接通的电话、最后是保持的电话。3 更改通话音量蓝牙耳机更改通话的音量回掉com_android_bluetooth.cpp中的volume_control_callback()函数该函数主要操作是调用HeadsetStateMachine的onVolumeChnaged()函数代码如下private void onVolumeChanged(int type, int volume) {StackEvent event new StackEvent(EVENT_TYPE_VOLUME_CHANGED);event.valueInt type;event.valueInt2 volume;sendMessage(STACK_EVENT, event);}此时HeadsetStateMachine可能处于Conneted或AudioOn状态这两种状态收到该消息的处理一样都是调用processVolumeEvent,代码如下private void processVolumeEvent(int volumeType, int volume) {if (volumeType HeadsetHalConstants.VOLUME_TYPE_SPK) {mPhoneState.setSpeakerVolume(volume);//是否在ui上显示int flag (getCurrentState() mAudioOn) ? AudioManager.FLAG_SHOW_UI : 0;//设置SCO通道声音大小。mAudioManager.setStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO, volume, flag);} else if (volumeType HeadsetHalConstants.VOLUME_TYPE_MIC) {// 只是存了下该volume值并没有设置mic。mPhoneState.setMicVolume(volume);} else {}}更改音量两种类型VOLUME_TYPE_MIC类型保存了下该值并没有看到具体用该值的地方。对于VOLUME_TYPE_SPK类型的会设置SCO声音大小。如果此时处于AudioOn状态则会在UI上显示。4 拨打电话蓝牙耳机进行拨打电话回掉com_android_bluetooth.cpp中的dial_call_callback函数该函数主要操作是调用HeadsetStateMachine的onDialCall()函数代码如下private void onDialCall(String number) {StackEvent event new StackEvent(EVENT_TYPE_DIAL_CALL);event.valueString number;sendMessage(STACK_EVENT, event);}此时HeadsetStateMachine可能处于Conneted或AudioOn状态这两种状态收到该消息的处理一样都是调用processDialCall,代码如下private void processDialCall(String number) {String dialNumber;if ((number null) || (number.length() 0)) {//获取最近向外打的电话号码dialNumber mPhonebook.getLastDialledNumber();if (dialNumber null) { //没有最近拨打的电话回应erroratResponseCodeNative(HeadsetHalConstants.AT_RESPONSE_ERROR, 0);return;}} else if (number.charAt(0) ) {//测试} else {// Remove trailing ;if (number.charAt(number.length() - 1) ;) {number number.substring(0, number.length() - 1);}dialNumber PhoneNumberUtils.convertPreDial(number);}terminateScoUsingVirtualVoiceCall(); // 终止虚拟呼叫Intent intent new Intent(Intent.ACTION_CALL_PRIVILEGED,Uri.fromParts(SCHEME_TEL, dialNumber, null));intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);mService.startActivity(intent); //开启拨打电话的界面mDialingOut true;sendMessageDelayed(DIALING_OUT_TIMEOUT, DIALING_OUT_TIMEOUT_VALUE);}蓝牙耳机发过来的命令可能携带电话号码也可能不带对于没有电话号码则查询最近的拨打电话记录拨打最近拨打的电话。对于有号码则拨打该号码。Intent.ACTION_CALL_PRIVILEGED(该变量是hide的,执行任何号码的呼叫,紧急或不紧急)”android.intent.action.CALL_PRIVILEGED”通过该action打开系统应用Phone中的OutgoingCallBroadcaster界面向外进行拨打电话。
http://www.pierceye.com/news/822650/

相关文章:

  • 河南便宜网站建设费用wordpress 记录访问ip
  • 汽车网站建设代理加盟深圳网络制作公司
  • 国外的旅游网站做的如何织梦网站根目录在哪里
  • 网站建设建站在线建站专业网站建设机构
  • 西安市城乡建设网官方网站衡水移动网站建设报价
  • 禅城区企业网站建设微信公众号网页版入口
  • 网站开发概述多城市二手车网站源码
  • 网站建设的内容策略本人做静态网站开发
  • 网站建设到运营赚钱网站主体负责人邮箱
  • 国外有在线做设计方案的网站吗网站地址免费
  • 做谷歌网站使用什么统计代码吗公司流程建设的意义
  • 网站广告收入如何缴文化事业建设费东莞人才市场招聘信息2023
  • 各大网站网址目录云服务器是什么意思
  • 免费作文网站张家港做网站排名
  • 具有营销价值好的网站找网站建设需要问什么软件
  • 免费好用的网页制作软件网站建设优化开发公司
  • 跟我一起做网站pdf电驴建设网站公开教学视频
  • 广州网站制作商怎样查看网站的权重
  • 网站群建设标准最好的响应式网站
  • 石家庄市建设厅网站网页网页设计班
  • 网站首页怎么设计公司网页制作培训试题
  • 虚拟主机怎么做网站新seo排名点击软件
  • 买服务器做网站 镜像选什么网页设计用的软件
  • 内江 网站建设网站后台登录地址
  • 网站建设合同副本临沂建设局官方网站
  • 林州网站建设哪家好网站做电子链接标识申请好吗
  • 石家庄开发网站建设263企业邮箱登录邮箱
  • 青岛公司建设网站电子商务网站开发技术论文
  • 龙华网站的建设建设网站教程视频视频
  • 威海高区建设局网站品牌网站建设多少钱