开启启动服务:BluetoothControlService
onCreate(){
BtSettingReceiver 广播接收{    
                cStartDisconnect = "com.neusoft.optimus.preceptor.disconnect"      断开所有设备
                 cActionPowerOFF = "android.intent.action.POWER_OFF"        POWER_OFF时收到的广播
                cActionPowerON = "android.intent.action.POWER_ON"        POWER_ON时收到的广播
                cDisableBluetooth = "com.neusoft.setting.bt.disable"        关闭开关的广播(暂时没用)
                cEnableBluetooth = "com.neusoft.setting.bt.enable"        打开开关的广播
                cActionBtVersion = "android.intent.action.btversion"        蓝牙版本的广播
                cFactoryReset= "com.neusoft.geely.factoryreset"            恢复出厂设置的广播
                CALL_STATE_CHANGED = "com.neusoft.geely.callstatechanged"    电话状态的广播
                GET_BLUETOOTH_ADDRESS = "com.neusoft.geely.bluetooth.getmacaddress" MAC地址广播
                cIsEnabled = "BluetoothEnabledState"                防止断开没有反馈,造成页面置灰不复归}

bindService() {
                onServiceConnected{//服务连接成功
                            1通过aidl获取uiComand(The API interface is for Bluetooth Settings Service.)
                            2注册CallBack(可以通过CallBack来获取蓝牙设备的各种协议状态)
                            3设置自动连接uiCommand.setBtAutoConnect
                            4updateBluetoothState()更新蓝天状态
                            5判断打火状态(防止打火power off的时候关机启动,开关状态没有复归)}


(同上2)SettingCallBack{
                onBluetoothServiceReady 蓝牙准备状态
                onAdapterStateChanged()(指示本地蓝牙适配器的状态已更改。用于蓝牙启用和禁用){
                            BT_STATE_OFF (int) 300        关闭
                            BT_STATE_TURNING_ON (int) 301 正在打开
                            BT_STATE_ON (int) 302          打开        
                            BT_STATE_TURNING_OFF (int) 303正在关闭}                                
                        retPairedDevices()这个回调是对reqBtPairedDevices的响应。{
                            可以获取配对列表
                            }
                onDeviceBondStateChanged{回调,通知远程设备的绑定(配对)状态更改。这个回调可能是对reqBtPair(配对)的响应。
                            BOND_NONE (int) 330    没有绑定上    绑定失败,弹出失败的弹窗
                            BOND_BONDING (int) 331 正在绑定      发送正在绑定的广播(如果时间超过30秒就断开)
                            BOND_BONDED (int) 332}    已经绑定上   reqBtConnectHfpA2dp 去请求连接hfp协议
                            如果绑定上了,直接去请求连接hfp
                            sortDevices(address, NfDef.BOND_BONDED);先排序}
                onDeviceOutOfRange{  车机超出连接范围
                            linklost}
                onHfpStateChanged(){回调,通知HFP连接远程设备的状态变化。
                            STATE_NOT_INITIALIZED (int) 100 没有初始化 
                            STATE_READY (int) 110        已准备状态 如果已经配对了,但是返回的还是此状态,会弹出失败的弹窗
                                            sendBtConnectState(2)失败的状态
                            STATE_CONNECTING (int) 120    正在连接   发送正在连接的广播Variables.cIsEnabled
                            STATE_DISCONNECTING (int) 125   正在断开连接
                            STATE_CONNECTED (int) 140     已经连接   如果已经配对,弹出连接成功 通过RPC获取的配对的地址        
                onA2dpStateChanged(){回调,通知A2DP连接远程设备的状态更改。
                            STATE_NOT_INITIALIZED (int) 100 没有初始化
                            STATE_READY (int) 110        已准备OK状态 如果自动连接,并且不是linklost,连接超时。如果hfp已
经连接过(_btConnectState = 1)弹出断开连接
                            STATE_CONNECTING (int) 120    正在连接
                            STATE_DISCONNECTING (int) 125    正在断开连接
                            STATE_CONNECTED (int) 140    已经连接    获取设备名称,防止手机端修改之后获取新的名称,如果hfp
连接地址不一样需要断开hfp连接。如果HFP或者A2DP并且不在连接状态下弹出已连接提示;
                            STATE_STREAMING (int) 150}    意味着连接和播放。
                onAvrcpStateChanged(){回调,通知状态变化的AVRCP连接远程设备。
                            STATE_NOT_INITIALIZED (int) 100 没有初始化
                            STATE_READY (int) 110        已准备状态  
                            STATE_CONNECTED (int) 140    已经连接
                            STATE_BROWSING (int) 145}    状态state_browse表示已连接和正在浏览。
                            没有做任何事情,只是保留了状态}
UiCommand()API接口用于蓝牙设置服务。    1注册callbak,来获取协议的回调
                     _uiCommand.registerBtCallback(SettingCallBack);

2设置自动连接
                     _uiCommand.setBtAutoConnect(AUTO_CONNECT_WHEN_PAIRED,-1);
                             _uiCommand.setBtAutoConnect(AUTO_CONNECT_WHEN_OOR,-1);
                             _uiCommand.setBtAutoConnect(AUTO_CONNECT_WHEN_BT_ON,-1);

3开关状态
                     _uiCommand.getBtState()
                    
                    4获取本地蓝牙地址
                     _uiCommand.getBtLocalAddress()
                    
                    5设置蓝牙开关
                     _uiCommand.setBtEnable(true)

6停止扫描远程设备的进程
                     _uiCommand.cancelBtDiscovery()
                    
                    7取消配对
                     _uiCommand.reqBtUnpair(d.getAddress())
                    
                    8设置本机名称
                     _uiCommand.setBtLocalName("LYNK&CO_BT")

9请求连接HFP/A2DP
                     _uiCommand.reqBtConnectHfpA2dp(address)

10获取手机设备名称
                     _uiCommand.getBtRemoteDeviceName(address)
                
                    11获取HFP连接状态
                     _uiCommand.getHfpConnectionState()
            
                    12断开HFP连接
                     _uiCommand.reqHfpDisconnect(hfpConnectAddress)
    
                    13请求配对
                     _uiCommand.reqBtPairedDevices();

14获取HFP连接地址
                     _uiCommand.getHfpConnectedAddress()

15获取A2DP连接地址
                     _uiCommand.getA2dpConnectedAddress()

16获取AVRCP连接地址
                     _uiCommand.getAvrcpConnectedAddress()
        
                    17获取A2DP连接地址
                    _uiCommand.getA2dpConnectionState()
        
                    18断开A2DP连接    
                    _uiCommand.reqA2dpDisconnect(a2dpConnectAddress)

19获取NF服务的版本号
                    _uiCommand.getNfServiceVersionName()
            
                    20请求断开连接
                    _uiCommand.reqBtDisconnectAll();

列表加载过程:    RecycleView(主分支)
                RecyclerView rvDeviceList = (RecyclerView) rootView.findViewById(R.id.rvDeviceList); 初始化
                rvDeviceList.setOverScrollMode(View.OVER_SCROLL_NEVER);   设置滚动模式            
                final RecyclerView.LayoutManager pairedManager = new GridLayoutManagerWrapper(getActivity(),1);    设置LayoutManager 增加异
常处理
                _devicesAdapter = new DeviceAdapter(getActivity(), _devicePresenter.getBluetoothBean());
                                    _devicePresenter.getBluetoothBean()获取数据
                                    _devicePresenter = new DeviceListPresenter(_bluetoothBean, getActivity());
                                    _bluetoothBean = BluetoothBean.getDefaultAdapter()
                                    new BluetoothBean()
                                    _deviceList = new ArrayList<BluetoothDevice>()
                                    通过retPairedDevices回调_deviceList.add(dev) 获取数据
                                    
                _devicesAdapter.setIDataSource();
                rvDeviceList.setAdapter(_devicesAdapter);

DeviceAdapter(适配器里面操作流程)
        BluetoothBean(实现的主要功能:修改设备名称 数据的获取和处理,是MVP模式中的M)
                _uiCommand.registerBtCallback(SettingCallBack) 初始化的时候注册uiCommand接口的回调
                onAdapterStateChanged(当蓝牙开关,开启或者关闭的时候)
                                    _deviceList.clear() (如果当前开关关闭,清空列表)    
                                    onBluetoothStateChanged  蓝牙状态发生改变时回调
                onAdapterDiscoveryStarted(当扫描状态改变的时候)onScanningStateChanged 扫描状态发生改变时回调 * @param started true:开始
扫描 false:扫描结束
                retPairedDevices(配对列表返回的数据)     _deviceList.add(dev) 添加到列表里面            
                                    _dataSourceListener.onDataUpdate(); 刷新页面
                onDeviceFound (通过搜索之后查找到的设备列表)_uiCommand.cancelBtDiscovery();如果当前扫描的设备大于等于15个的话就会停止扫

                                    _deviceList.add(device);将数据添加到列表里
                                    _dataSourceListener.onDataInsert(_deviceList.size());更新数据列表
                onDeviceBondStateChanged(绑定手机)                                    
                                    sortDevices()绑定完手机需要排序,如果当前设备已绑定,把当前设备排在第一位 
                            关于手机连接车机的时候会有绑定的回调此时也会返回 retPairedDevices                                
开启启动服务:BluetoothControlService
onCreate(){
BtSettingReceiver 广播接收{    
                cStartDisconnect = "com.neusoft.optimus.preceptor.disconnect"      断开所有设备
                 cActionPowerOFF = "android.intent.action.POWER_OFF"        POWER_OFF时收到的广播
                cActionPowerON = "android.intent.action.POWER_ON"        POWER_ON时收到的广播
                cDisableBluetooth = "com.neusoft.setting.bt.disable"        关闭开关的广播(暂时没用)
                cEnableBluetooth = "com.neusoft.setting.bt.enable"        打开开关的广播
                cActionBtVersion = "android.intent.action.btversion"        蓝牙版本的广播
                cFactoryReset= "com.neusoft.geely.factoryreset"            恢复出厂设置的广播
                CALL_STATE_CHANGED = "com.neusoft.geely.callstatechanged"    电话状态的广播
                GET_BLUETOOTH_ADDRESS = "com.neusoft.geely.bluetooth.getmacaddress" MAC地址广播
                cIsEnabled = "BluetoothEnabledState"                防止断开没有反馈,造成页面置灰不复归}

bindService() {
                onServiceConnected{//服务连接成功
                            1通过aidl获取uiComand(The API interface is for Bluetooth Settings Service.)
                            2注册CallBack(可以通过CallBack来获取蓝牙设备的各种协议状态)
                            3设置自动连接uiCommand.setBtAutoConnect
                            4updateBluetoothState()更新蓝天状态
                            5判断打火状态(防止打火power off的时候关机启动,开关状态没有复归)}


(同上2)SettingCallBack{
                onBluetoothServiceReady 蓝牙准备状态
                onAdapterStateChanged()(指示本地蓝牙适配器的状态已更改。用于蓝牙启用和禁用){
                            BT_STATE_OFF (int) 300        关闭
                            BT_STATE_TURNING_ON (int) 301 正在打开
                            BT_STATE_ON (int) 302          打开        
                            BT_STATE_TURNING_OFF (int) 303正在关闭}                                
                        retPairedDevices()这个回调是对reqBtPairedDevices的响应。{
                            可以获取配对列表
                            }
                onDeviceBondStateChanged{回调,通知远程设备的绑定(配对)状态更改。这个回调可能是对reqBtPair(配对)的响应。
                            BOND_NONE (int) 330    没有绑定上    绑定失败,弹出失败的弹窗
                            BOND_BONDING (int) 331 正在绑定      发送正在绑定的广播(如果时间超过30秒就断开)
                            BOND_BONDED (int) 332}    已经绑定上   reqBtConnectHfpA2dp 去请求连接hfp协议
                            如果绑定上了,直接去请求连接hfp
                            sortDevices(address, NfDef.BOND_BONDED);先排序}
                onDeviceOutOfRange{  车机超出连接范围
                            linklost}
                onHfpStateChanged(){回调,通知HFP连接远程设备的状态变化。
                            STATE_NOT_INITIALIZED (int) 100 没有初始化 
                            STATE_READY (int) 110        已准备状态 如果已经配对了,但是返回的还是此状态,会弹出失败的弹窗
                                            sendBtConnectState(2)失败的状态
                            STATE_CONNECTING (int) 120    正在连接   发送正在连接的广播Variables.cIsEnabled
                            STATE_DISCONNECTING (int) 125   正在断开连接
                            STATE_CONNECTED (int) 140     已经连接   如果已经配对,弹出连接成功 通过RPC获取的配对的地址        
                onA2dpStateChanged(){回调,通知A2DP连接远程设备的状态更改。
                            STATE_NOT_INITIALIZED (int) 100 没有初始化
                            STATE_READY (int) 110        已准备OK状态 如果自动连接,并且不是linklost,连接超时。如果hfp已
经连接过(_btConnectState = 1)弹出断开连接
                            STATE_CONNECTING (int) 120    正在连接
                            STATE_DISCONNECTING (int) 125    正在断开连接
                            STATE_CONNECTED (int) 140    已经连接    获取设备名称,防止手机端修改之后获取新的名称,如果hfp
连接地址不一样需要断开hfp连接。如果HFP或者A2DP并且不在连接状态下弹出已连接提示;
                            STATE_STREAMING (int) 150}    意味着连接和播放。
                onAvrcpStateChanged(){回调,通知状态变化的AVRCP连接远程设备。
                            STATE_NOT_INITIALIZED (int) 100 没有初始化
                            STATE_READY (int) 110        已准备状态  
                            STATE_CONNECTED (int) 140    已经连接
                            STATE_BROWSING (int) 145}    状态state_browse表示已连接和正在浏览。
                            没有做任何事情,只是保留了状态}
UiCommand()API接口用于蓝牙设置服务。    1注册callbak,来获取协议的回调
                     _uiCommand.registerBtCallback(SettingCallBack);

2设置自动连接
                     _uiCommand.setBtAutoConnect(AUTO_CONNECT_WHEN_PAIRED,-1);
                             _uiCommand.setBtAutoConnect(AUTO_CONNECT_WHEN_OOR,-1);
                             _uiCommand.setBtAutoConnect(AUTO_CONNECT_WHEN_BT_ON,-1);

3开关状态
                     _uiCommand.getBtState()
                    
                    4获取本地蓝牙地址
                     _uiCommand.getBtLocalAddress()
                    
                    5设置蓝牙开关
                     _uiCommand.setBtEnable(true)

6停止扫描远程设备的进程
                     _uiCommand.cancelBtDiscovery()
                    
                    7取消配对
                     _uiCommand.reqBtUnpair(d.getAddress())
                    
                    8设置本机名称
                     _uiCommand.setBtLocalName("LYNK&CO_BT")

9请求连接HFP/A2DP
                     _uiCommand.reqBtConnectHfpA2dp(address)

10获取手机设备名称
                     _uiCommand.getBtRemoteDeviceName(address)
                
                    11获取HFP连接状态
                     _uiCommand.getHfpConnectionState()
            
                    12断开HFP连接
                     _uiCommand.reqHfpDisconnect(hfpConnectAddress)
    
                    13请求配对
                     _uiCommand.reqBtPairedDevices();

14获取HFP连接地址
                     _uiCommand.getHfpConnectedAddress()

15获取A2DP连接地址
                     _uiCommand.getA2dpConnectedAddress()

16获取AVRCP连接地址
                     _uiCommand.getAvrcpConnectedAddress()
        
                    17获取A2DP连接地址
                    _uiCommand.getA2dpConnectionState()
        
                    18断开A2DP连接    
                    _uiCommand.reqA2dpDisconnect(a2dpConnectAddress)

19获取NF服务的版本号
                    _uiCommand.getNfServiceVersionName()
            
                    20请求断开连接
                    _uiCommand.reqBtDisconnectAll();

列表加载过程:    RecycleView(主分支)
                RecyclerView rvDeviceList = (RecyclerView) rootView.findViewById(R.id.rvDeviceList); 初始化
                rvDeviceList.setOverScrollMode(View.OVER_SCROLL_NEVER);   设置滚动模式            
                final RecyclerView.LayoutManager pairedManager = new GridLayoutManagerWrapper(getActivity(),1);    设置LayoutManager 增加异
常处理
                _devicesAdapter = new DeviceAdapter(getActivity(), _devicePresenter.getBluetoothBean());
                                    _devicePresenter.getBluetoothBean()获取数据
                                    _devicePresenter = new DeviceListPresenter(_bluetoothBean, getActivity());
                                    _bluetoothBean = BluetoothBean.getDefaultAdapter()
                                    new BluetoothBean()
                                    _deviceList = new ArrayList<BluetoothDevice>()
                                    通过retPairedDevices回调_deviceList.add(dev) 获取数据
                                    
                _devicesAdapter.setIDataSource();
                rvDeviceList.setAdapter(_devicesAdapter);

DeviceAdapter(适配器里面操作流程)
        BluetoothBean(实现的主要功能:修改设备名称 数据的获取和处理,是MVP模式中的M)
                _uiCommand.registerBtCallback(SettingCallBack) 初始化的时候注册uiCommand接口的回调
                onAdapterStateChanged(当蓝牙开关,开启或者关闭的时候)
                                    _deviceList.clear() (如果当前开关关闭,清空列表)    
                                    onBluetoothStateChanged  蓝牙状态发生改变时回调
                onAdapterDiscoveryStarted(当扫描状态改变的时候)onScanningStateChanged 扫描状态发生改变时回调 * @param started true:开始
扫描 false:扫描结束
                retPairedDevices(配对列表返回的数据)     _deviceList.add(dev) 添加到列表里面            
                                    _dataSourceListener.onDataUpdate(); 刷新页面
                onDeviceFound (通过搜索之后查找到的设备列表)_uiCommand.cancelBtDiscovery();如果当前扫描的设备大于等于15个的话就会停止扫描
                                    _deviceList.add(device);将数据添加到列表里
                                    _dataSourceListener.onDataInsert(_deviceList.size());更新数据列表
                onDeviceBondStateChanged(绑定手机)                                    
                                    sortDevices()绑定完手机需要排序,如果当前设备已绑定,把当前设备排在第一位 
                            关于手机连接车机的时候会有绑定的回调此时也会返回 retPairedDevices                                
    onHfpStateChanged(htp协议状态改变)

入口
BtManagerService  服务  会在adapterApi 里面Bt create(Context context) 绑定该服务
启动服务之后初始化数据
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
1绑定服务bindHfpService();
CLASS_SERVICE_HFP = "com.nforetek.bt.service.NfServiceHfp";
通过_phone.setNfCommandHfp(mCommandHfp);
把实例传递给phone类,该类会展现hfp数据变化
(RemoteCallbackList 是一个泛型,支持管理任意的 AIDL 接口,从它的声明可以看出,因为所有的 AIDL 接口都继承自 IInteface 接口)

1该服务顾凯会回调hfp协议数据变化
INfCallbackHfp mCallbackHfp = new INfCallbackHfp.Stub()
回调 void onHfpServiceReady() 回调通知HFP服务准备好了

回调 onHfpStateChanged(String address, final int prevState, final int newState) 通知HFP连接远程设备的状态变化。
(address - Bluetooth MAC address of remote device.
  prevState - the previous state.
  newState - the new state.)
STATE_NOT_INITIALIZED (int) 100 没有初始化状态 
STATE_READY (int) 110           已经准备好的状态
STATE_CONNECTED (int) 140    连接成功的状态
STATE_CONNECTTING (int) 120    正在连接的状态
STATE_IS_DISCONNECTED(int) 125  正在断开连接的状态

如果newState == NfDef.STATE_READY 1发送电话状态为关闭的状态
                  2setRpcCallState(){0x1 InCall  ?
                            0x2 Idle    ?
                            0x3 CarPlay Incall    ?
                            0x4 CarPlay Idle    ?}
                  3 setForRVC(0);//set给RVC,通知电话状态结束
回调 onHfpAudioStateChanged     回调,通知HFP连接远程设备的音频状态变化。 判断电话声音是否有
STATE_NOT_INITIALIZED (int) 100 没有初始化状态 
STATE_READY (int) 110           已经准备好的状态
STATE_CONNECTED (int) 140    连接成功的状态
STATE_CONNECTTING (int) 120    正在连接的状态
STATE_IS_DISCONNECTED(int) 125  正在断开连接的状态

回调 onHfpVoiceDial(final String address, final boolean isVoiceDialOn) 通知HFP连接远程设备的语音拨号状态。
address - Bluetooth MAC address of remote device.
isVoiceDialOn - return voice dial status (True/False).

回调 onHfpErrorResponse(final String address, final int code) 通知HFP连接的远程设备的错误响应。
address - Bluetooth MAC address of remote device.
code - HFP error information

回调 onHfpRemoteTelecomService(final String address, final boolean isTelecomServiceOn) 从HFP连接的远程设备通知“电信服务”状态的更改。
address - Bluetooth MAC address of remote device.
isTelecomServiceOn - possible value are:

=false 意味着没有服务。没有可用的家庭/漫游网络。

=true 意味着服务的存在。家庭/漫游网络可用。

回调 onHfpRemoteRoamingStatus(final String address, final boolean isRoamingOn) 从HFP连接的远程设备通知“漫游”状态的变化。
address - Bluetooth MAC address of remote device which involves state changed.
isRoamingOn - possible value are:

=false 意味着漫游不活跃。
=true 意味着漫游是活动的。

回调 onHfpRemoteBatteryIndicator(final String address, final int currentValue, final int maxValue,final int minValue) 从HFP连接的远程设备通知“电池”指示灯的
变化。
address - Bluetooth MAC address of remote device.
currentValue - current battery value
maxValue - 最大电池值
minValue - 最小电池值

回调 onHfpRemoteSignalStrength(final String address, final int currentStrength, final int maxStrength,final int minStrength)从HFP连接的远程设备通知“信号”强
度的变化。
address - Bluetooth MAC address of remote device.
currentStrength - current signal strength
maxStrength - 最大信号强度
minStrength - 最小信号强度

回调 onHfpCallChanged(final String address, final NfHfpClientCall call)更新活动的电话号码或/和保持号码,如果有任何变化,无论是多调用或单调用。
address - Bluetooth MAC address of remote device which involves state changed.
call - changed call
NfHfpClientCall 该实体类 提供电话属性
call.getNumber() 电话号码 
call.getState() 电话状态
             CALL_STATE_ACTIVE  0 通话中
            CALL_STATE_INCOMING 4 来电
                    CALL_STATE_TERMINATED 7 挂断
            CALL_STATE_DIALING 2    正在拨打的呼出电话
            CALL_STATE_WAITING  5   等待中
            CALL_STATE_HELD  1
call.isOutgoing() 是否正在通话中  call.isMultiParty() 几方通话?
phoneNumberInfos 指的是正在通话中的列表?
_hfp.getHfpRemoteSubscriberNumber() 指的是什么号码?
-------------------------------------------------------------------------------------------------------------------
IHfp.Stub _hfp = new IHfp.Stub()
执行 isHfpServiceReady() 获取HFP服务是否准备好了

执行 registerHfpCallback(IHfpCallback cb) 注册HFPcallback

执行 unregisterHfpCallback 取消注册HFPcallback

执行 getHfpConnectionState() 获取hfp连接的状态

执行 isHfpConnected() hfp是否已连接

执行 getHfpConnectedAddress() 获取hfp连接地址

执行 getHfpAudioConnectionState() 获取HFP连接远程设备的当前音频状态。

执行 reqHfpConnect(String address) 这个现在不使用了吗?

执行 reqHfpDisconnect(String address) 这个现在不使用了吗?

执行 getHfpRemoteSignalStrength 获取HFP连接远程设备的信号强度。

执行 getHfpCallList() 获取HFP连接远程设备的活动电话号码信息

执行 isHfpRemoteOnRoaming() 检查HFP连接的远程设备是否处于漫游状态。

执行 getHfpRemoteBatteryIndicator 获取HFP连接远程设备的电池指示灯。

执行 isHfpRemoteTelecomServiceOn() 检查HFP连接的远程设备是否有电信服务。

执行 isHfpRemoteVoiceDialOn() 检查HFP连接远程设备的语音拨号是否激活。

执行 reqHfpDialCall(String number) 请求HFP连接远程设备,使用给定的电话号码拨打电话。
这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数onHfpCallChanged和onHfpAudioStateChanged,以便在随后的配置文件状态更改时得到通知。

执行 reqHfpReDial()  请求HFP连接的远程设备重新拨打最后一次呼出电话。
这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数onHfpCallChanged和onHfpAudioStateChanged,以便在随后的配置文件状态更改时得到通知。

执行 reqHfpMemoryDial(String index) 请求HFP连接的远程设备进行内存拨号。?
这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数onHfpCallChanged和onHfpAudioStateChanged,以便在随后的配置文件状态更改时得到通知。

执行 reqHfpAnswerCall(int flag) 请求HFP连接远程设备来接听来电。
这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数onHfpCallChanged和onHfpAudioStateChanged,以便在随后的配置文件状态更改时得到通知。

执行 reqHfpRejectIncomingCall() 请求HFP连接远程设备拒绝来电。
这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数onHfpCallChanged和onHfpAudioStateChanged,以便在随后的配置文件状态更改时得到通知。

执行 reqHfpTerminateCurrentCall() 请求HFP连接的远程设备终止正在进行的调用。
这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数onHfpCallChanged和onHfpAudioStateChanged,以便在随后的配置文件状态更改时得到通知。

执行 reqHfpSendDtmf(String number) 请求HFP连接远程设备发送DTMF。 ?
由于兼容性,请每次使用单个DTMF号请求此API。

避免使用串行DTMF号进行请求。

执行 reqHfpAudioTransferToCarkit() 请求HFP连接远程设备将音频传输到Carkit。?
这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数onHfpAudioStateChanged,以便在后续状态更改时得到通知。

返回:

如果命令成功发送,则为true

执行 reqHfpAudioTransferToPhone() 请求HFP连接远程设备将音频传输到电话。
这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数onHfpAudioStateChanged,以便在后续状态更改时得到通知。

返回:

如果命令成功发送,则为true

执行 getHfpRemoteNetworkOperator() 获取HFP连接远程设备的网络操作员。

返回:

网络运营商

执行 getHfpRemoteSubscriberNumber()获取HFP连接远程设备的用户编号。

返回:

用户号码

执行 reqHfpVoiceDial(boolean enable) 请求HFP连接远程设备进行语音拨号。

这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数onHfpCallChanged和onHfpAudioStateChanged,以便在随后的配置文件状态更改时得到通知。

参数:

使能-真,开
始语音拨号。

返回:

true表示操作成功,或false表示错误。

执行 pauseHfpRender() 停止发送HFP流数据到音频轨道。

执行 startHfpRender() 开始发送HFP流数据到音频轨道。

执行 isHfpMicMute() 检查麦克风是否静音。

执行 muteHfpMic(boolean mute) 呼叫时请求HFP静音麦克风

参数:

静音-ture 表示静音麦克风

执行 isHfpInBandRingtoneSupport() 检查远程设备是否支持带内铃声。仅在HFP连接时可用。

-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
2绑定服务bindPbapService();
CLASS_SERVICE_PBAP = "com.nforetek.bt.service.NfServicePbap";

NfPbap 该类执行

回调 onPbapServiceReady 回调通知Pbap服务准备好了

回调 onPbapStateChanged(final String address, final int prevState, final int newState, final int reason, final int counts) 回调,通知具有给定蓝牙硬件地址的远
程连接设备的PBAP状态的变化。

此配置文件中可能的状态值为:
STATE_NOT_INITIALIZED (int) 100   未初始化
STATE_READY (int) 110          准备好
STATE_DOWNLOADING (int) 140      已连接
地址-涉及状态改变的远程设备的蓝牙MAC地址。

prevState—前一个状态。

newState—新的状态。

原因-其他状态的原因返回到STATE_READY,这意味着下载完成。
可能的值是:

REASON_DOWNLOAD_FULL_CONTENT_COMPLETED (int) 1

REASON_DOWNLOAD_FAILED (int) 2

REASON_DOWNLOAD_TIMEOUT (int) 3

REASON_DOWNLOAD_USER_REJECT (int) 4

否则,原因是-1。

点数-下载或更新的vcard数量。只有当状态从state_download更改为STATE_READY时,此参数才可用且有意义。否则,计数为-1。

回调 retPbapDownloadedContact(final NfPbapContact contact) 回调,通知具有给定蓝牙硬件地址的远程连接设备对reqPbapDownload的响应。 ?

回调 retPbapDownloadedCallLog(final String address, final String firstName, final String middleName, final String lastName, final String number, final int
type, final String timestamp)
回调,通知具有给定蓝牙硬件地址的远程连接设备对reqPbapDownload的响应。

参数:

地址-远程设备的蓝牙MAC地址。

名字-意思是这个联系人的名字。

中间名-联系中间名。

姓-联系姓。

number - number表示这个调用日志的数量。

类型-可能的存储类型有:

PBAP_STORAGE_MISSED_CALLS (int) 5  未接来电
PBAP_STORAGE_RECEIVED_CALLS (int) 6

已接来电
PBAP_STORAGE_DIALED_CALLS (int) 7已播出电话
PBAP_STORAGE_CALL_LOGS (int) 8 ?

回调 onPbapDownloadNotify(final String address, final int storage, final int totalContacts, final int downloadedContacts)

回调,通知指定数量的vcard已从远程设备下载并保存到本地数据库。

由于reqPbapDownload、reqPbapDownloadRange和setPbapDownloadNotify的参数频率设置为非零,因此可能会
调用此回调。

参数:

地址-远程设备的蓝牙MAC地址。

存储-可能的存储类型有:

PBAP_STORAGE_SIM (int) 1

PBAP_STORAGE_PHONE_MEMORY (int) 2

PBAP_STORAGE_SPEEDDIAL (int) 3

PBAP_STORAGE_FAVORITE (int) 4

PBAP_STORAGE_MISSED_CALLS (int) 5

PBAP_STORAGE_RECEIVED_CALLS (int) 6

PBAP_STORAGE_DIALED_CALLS (int) 7

PBAP_STORAGE_CALL_LOGS (int) 8

totalContacts—下载的联系人总数。
-------------------------------------------------------------------------------------------------------------------
IPbap _pbap =new IPbap.Stub()
执行 isPbapDownloading() 请求使用vCard从远程设备下载电话簿,并传递回调给用户。

这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数retPbapDownloadedContact和retPbapDownloadedCallLog和onPbapStateChanged以通知后续结果。

执行 isPbapDownloading() 检查本地设备是否正在从远程设备下载电话簿。

返回:

为真表示PBAP正在下载,或为假断开连接。

执行 getPbapDownloadingAddress() 获取下载远程设备PBAP的蓝牙硬件地址

执行 reqPbapDownload(String address, int storage, int property)  请求使用vCard从远程设备下载电话簿,并传递回调给用户。
存储-可能的存储类型有:

PBAP_STORAGE_SIM (int) 1  ?

PBAP_STORAGE_PHONE_MEMORY (int) 2

PBAP_STORAGE_SPEEDDIAL (int) 3

PBAP_STORAGE_FAVORITE (int) 4

PBAP_STORAGE_MISSED_CALLS (int) 5

PBAP_STORAGE_RECEIVED_CALLS (int) 6

PBAP_STORAGE_DIALED_CALLS (int) 7

PBAP_STORAGE_CALL_LOGS (int) 8   ?

执行 reqPbapDownloadRange(String address, int storage, int property, int startPos, int offset) 请求使用vCard从远程设备下载电话簿,并传递回调给用户。

这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数retPbapDownloadedContact和retPbapDownloadedCallLog和onPbapStateChanged以通知后续结果。

执行 reqPbapDownloadInterrupt(String address) 请求中断正在从远程设备进行的下载。

客户端应该注册并实现回调函数onPbapStateChanged,以便在后续结果出现时得到通知。

执行 setPbapDownloadNotify(int frequency) 设置PBAP下载通知频率。
将在ServiceManager重启时设置为默认值。默认值为0表示不回调下载通知。例如,如果频率设置为5,每5个onPbapDownloadNofity联系人就会收到通知。
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
3绑定服务bindSettingService();

-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
4 Audio 执行
CLASS_SERVICE_A2DP = "com.nforetek.bt.service.NfServiceA2dp";
回调 onA2dpServiceReady 通知A2dp服务准备好了

回调 onA2dpStateChanged A2dp协议变化

执行 isA2dpServiceReady() 判断A2dp服务是否准备好

执行 getA2dpConnectionState() 获取A2dp协议连接状态

执行 isA2dpConnected() 判断A2dp是否已连接

执行 getA2dpConnectedAddress()  获取A2dp连接地址

执行 reqA2dpConnect(String address) 请求A2dp连接

执行 reqA2dpDisconnect(String address) 断开A2dp连接

执行 pauseA2dpRender() 停止发送A2DP流数据到音频轨道。

执行 startA2dpRender()  开始发送A2DP流数据到音频轨道。

CLASS_SERVICE_AVRCP = "com.nforetek.bt.service.NfServiceAvrcp";
回调 onAvrcpServiceReady() 通知Avrcp服务准备好了 
回调 onAvrcpStateChanged(final String address, final int prevState, final int newState)
mCommandAvrcp.reqAvrcpRegisterEventWatcher(NfDef.AVRCP_EVENT_ID_TRACK_CHANGED, 0);
mCommandAvrcp.reqAvrcpRegisterEventWatcher(NfDef.AVRCP_EVENT_ID_PLAYBACK_STATUS_CHANGED, 0);?这俩是干啥用的

回调 retAvrcp13ElementAttributesPlaying(final int[] metadataAtrributeIds,final String[] texts)从连接远程设备的A2DP/AVRCP中通知对
reqavrcp13getelementattributesplay的响应的回调。

参数:

metadataAtrributeIds -媒体属性id列表。
这些id用于惟一地标识媒体信息。
可能的值是:

AVRCP_META_ATTRIBUTE_ID_TITLE (int) 0x01:媒体的标题

AVRCP_META_ATTRIBUTE_ID_ARTIST (int) 0x02:艺术家的名字

AVRCP_META_ATTRIBUTE_ID_ALBUM (int) 0x03:唱片的名称

AVRCP_META_ATTRIBUTE_ID_NUMBER_OF_MEDIA (int) 0x04:媒体的数量,即CD的曲目数量

AVRCP_META_ATTRIBUTE_ID_TOTAL_NUMBER_OF_MEDIA(int) 0x05:媒体的总数,即CD的总曲目数

AVRCP_META_ATTRIBUTE_ID_GENRE (int) 0x06:genre

?
AVRCP_META_ATTRIBUTE_ID_SONG_LENGTH (int) 0x07:播放时间(毫秒)

回调 retAvrcp13PlayStatus(final long songLen, final long songPos, final byte statusId)回调通知响应reqAvrcp13GetPlayStatus从A2DP/AVRCP连接远程设备。

参数:

songLen—播放歌曲的总长度(以毫秒为单位)。
允许的值从0到(2^32 - 1)。

songPos—以毫秒为单位的当前播放位置。
允许的值从0到(2^32 - 1)。

当前播放状态。
可能的值是:

AVRCP_PLAYING_STATUS_ID_STOPPED (byte) 0x00: stopped

AVRCP_PLAYING_STATUS_ID_PLAYING (byte) 0x01:播放

AVRCP_PLAYING_STATUS_ID_PAUSED (byte) 0x02:暂停
AVRCP_PLAYING_STATUS_ID_FWD_SEEK (byte) 0x03: fwd seek


AVRCP_PLAYING_STATUS_ID_REW_SEEK (byte) 0x04: rev seek   ?

AVRCP_PLAYING_STATUS_ID_ERROR (byte) 0xFF:错误

回调 onAvrcp13EventPlaybackStatusChanged(byte statusId)回调,通知A2DP/AVRCP连接远程设备的回放状态的变化。

只有在使用reqAvrcpRegisterEventWatcher注册事件AVRCP_EVENT_ID_PLAYBACK_STATUS_CHANGED之前,才会调用此回调。

参数:

状态id -播放的当前状态。
可能的值是

AVRCP_PLAYING_STATUS_ID_STOPPED (byte) 0x00: stopped

AVRCP_PLAYING_STATUS_ID_PLAYING (byte) 0x01:播放

avrcp_playing_status_id_(byte) 0x02:

暂停
AVRCP_PLAYING_STATUS_ID_FWD_SEEK (byte) 0x03: fwd seek

AVRCP_PLAYING_STATUS_ID_REW_SEEK (byte) 0x04: rev seek

AVRCP_PLAYING_STATUS_ID_ERROR (byte) 0xFF:错误

回调 onAvrcp13EventTrackChanged() 回调,通知A2DP/AVRCP连接远程设备的轨迹变化。

只有在使用reqAvrcpRegisterEventWatcher注册事件AVRCP_EVENT_ID_TRACK_CHANGED之前,才会调用此回调。

参数:

元素-当前轨道的索引。

回调 onAvrcp13EventPlaybackPosChanged() 回调通知连接远程设备的A2DP/AVRCP回放位置的变化。

只有在使用reqAvrcpRegisterEventWatcher注册事件AVRCP_EVENT_ID_PLAYBACK_POS_CHANGED之前,才会调用此回调。并在以下条件下通知本次回调:

远程设备已达到注册播放间隔
时间

游戏状态改变。

改变当前的轨道。

到达轨道的终点或起点。

参数:

songPos -当前播放位置(毫秒)。

执行 isAvrcpServiceReady() 判断是否Avrcp协议已准备好

执行 getCurrentAttribute(int id) AdapterApi NF文档没有找到 ?

执行 getAvrcpConnectionState 获取Avrcp连接状态

执行 isAvrcpConnected()   判断Avrcp是否已连接

执行 getAvrcpConnectedAddress() 获取 Avrcp连接地址

执行 reqAvrcpConnect(String address) 请求连接Avrcp协议

执行 reqAvrcpDisconnect(String address) 请求断开Avrcp协议

执行 isAvrcp13Supported(String address) 请求远程设备是否支持AVRCP 1.3。

请求的地址必须是已配对的设备,并且当前已连接。

参数:

地址-配对和连接的AVRCP设备的有效蓝牙MAC地址。

返回:

如果设备不支持1.3版本或当前没有连接,则为false。

执行 isAvrcp14Supported(String address)请求远程设备是否支持AVRCP 1.4。

请求的地址必须是已配对的设备,并且当前已连接。

参数:

地址-配对和连接的AVRCP设备的有效蓝牙MAC地址。

返回:

如果设备不支持1.4版本或当前没有连接,则为false。

执行 reqAvrcpPlay()请求A2DP/AVRCP连接远程设备进行“播放”操作。

这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数onA2dpStateChanged,以便在后续配置文件状态更改时得到通知。

返回:

true表示操作成功,或false表示错误。

执行 reqAvrcpStop() 请求A2DP/AVRCP连接远程设备进行“停止”操作。

这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数onA2dpStateChanged,以便在后续配置文件状态更改时得到通知。

返回:

true表示操作成功,或false表示错误。

执行 reqAvrcpPause()请求A2DP/AVRCP连接远程设备进行“暂停”操作。

这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数onA2dpStateChanged,以便在后续配置文件状态更改时得到通知。

返回:

true表示操作成功,或false表示错误。

执行 reqAvrcpForward() 请求A2DP/AVRCP连接远程设备进行“转发”操作。

这是一个异步调用:它将立即返回。

返回:

true表示操作成功,或false表示错误。

执行 reqAvrcpBackward() 请求A2DP/AVRCP连接远程设备进行“反向”操作。

这是一个异步调用:它将立即返回。

返回:

true表示操作成功,或false表示错误。

执行 reqAvrcpVolumeUp() 请求A2DP/AVRCP连接远程设备进行“音量增加”操作。

这是一个异步调用:它将立即返回。

返回:

true表示操作成功,或false表示错误。

执行  reqAvrcpVolumeDown()请求A2DP/AVRCP连接远程设备进行“音量下降”操作。

这是一个异步调用:它将立即返回。

返回:

true表示操作成功,或false表示错误。

执行 reqAvrcpStartFastForward()请求A2DP/AVRCP连接远程设备开始“快进”操作。

这是一个异步调用:它将立即返回。

返回:

true表示操作成功,或false表示错误。

执行 reqAvrcpStopFastForward() 请求A2DP/AVRCP连接远程设备停止“快进”操作。
这是一个异步调用:它将立即返回。

返回:

true表示操作成功,或false表示错误。

执行 reqAvrcpStartRewind()请求A2DP/AVRCP连接远程设备开始“倒带”操作。

这是一个异步调用:它将立即返回。

返回:

true表示操作成功,或false表示错误。

执行 reqAvrcpStopRewind() 请求A2DP/AVRCP连接远程设备停止“倒带”操作。

这是一个异步调用:它将立即返回。

返回:

true表示操作成功,或false表示错误。

执行 reqAvrcp13GetCapabilitiesSupportEvent()请求从连接远程设备的A2DP/AVRCP获取支持的功能事件。
这是由CT发送来查询对等设备的功能。

这将请求远程设备支持的事件列表。
远程设备应该响应所有支持的事件,包括AVRCP v1.3规范中定义的强制事件。

这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数retAvrcp13CapabilitiesSupportEvent和onAvrcpErrorResponse,以得到后续结果的通知。

返回:

true表示操作成功,或false表示错误。

执行 reqAvrcp13GetPlayerSettingAttributesList() 请求从A2DP/AVRCP连接的远程设备获取支持的播放器应用程序设置属性。

保留的播放器应用程序设置属性列表在AVRCP v1.3规范的附录F中提供。

预期目标设备可能有未定义为规范一部分的其他属性。

这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数retAvrcp13PlayerSettingAttributesList和onAvrcpErrorResponse来通知后续结果。

返回:

true表示操作成功,
或false表示错误。

执行 reqAvrcp13GetPlayerSettingValuesList(byte attributeId) 请求从连接远程设备的A2DP/AVRCP获取所请求的播放器应用程序设置属性的可能值集。

保留的播放器应用程序设置属性及其值的列表在AVRCP v1.3规范的附录F中提供。

预期目标设备可能有未定义为规范一部分的附加属性值。

这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数retAvrcp13PlayerSettingValuesList和onAvrcpErrorResponse来通知后续结果。

参数:

attributeId—请求属性ID。
可能的值为:

AVRCP_SETTING_ATTRIBUTE_ID_EQUALIZER 0 x01(字节)

AVRCP_SETTING_ATTRIBUTE_ID_REPEAT_MODE 0 x02(字节)

AVRCP_SETTING_ATTRIBUTE_ID_SHUFFLE 0 x03(字节)

0 x04 AVRCP_SETTING_ATTRIBUTE_ID_SCAN(字节)

返回:

true表示操作成功,或false表示错误。

执行 reqAvrcp13GetPlayerSettingCurrentValues()请求从连接远程设备的A2DP/AVRCP获取当前设置值,以获取所提供的播放器应用程序设置属性。

这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数retAvrcp13PlayerSettingCurrentValues和onAvrcpErrorResponse来通知后续结果。

返回:

true表示操作成功,或false表示错误。

执行 reqAvrcp13SetPlayerSettingValue(byte attributeId, byte valueId)请求从连接远程设备的A2DP/AVRCP获取当前设置值,以获取所提供的播放器应用程序设置属性。

这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数retAvrcp13PlayerSettingCurrentValues和onAvrcpErrorResponse来通知后续结果。

返回:

true表示操作成功,
或false表示错误。

执行 reqAvrcp13GetElementAttributesPlaying请求从连接远程设备的A2DP/AVRCP获取参数中指定元素的属性

这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数retavrcp13elementattributesplay和onAvrcpErrorResponse,以便在随后的结果中得到通知。

返回:

true表示操作成功,或false表示错误。

执行 reqAvrcp13GetPlayStatus 请求从连接远程设备的A2DP/AVRCP获取当前播放媒体的状态

这是一个异步调用:它将立即返回,客户端应该注册并实现回调函数retAvrcp13PlayStatus和onAvrcpErrorResponse来通知后续结果。

返回:

true表示操作成功,或false表示错误。

蓝牙协议保留(为了防止电脑内丢失)相关推荐

  1. 蓝牙协议 HFP,HSP,A2DP等等

    简介: HSP(手机规格)– 提供手机(移动电话)与耳机之间通信所需的基本功能. HFP(免提规格)– 在 HSP 的基础上增加了某些扩展功能,原来只用于从固定车载免提装置来控制移动电话. A2DP( ...

  2. 蓝牙核心技术了解(蓝牙协议、架构、硬件和软件笔记)

    声明:这篇文章是楼主beautifulzzzz学习网上关于蓝牙的相关知识的笔记,其中比较多的受益于xubin341719的蓝牙系列文章,同时还有其他网上作者的资料.由于有些文章只做参考或统计不足,如涉 ...

  3. [蓝牙] 1、蓝牙核心技术了解(蓝牙协议、架构、硬件和软件笔记)

    From: https://www.cnblogs.com/zjutlitao/p/4742428.html 主要参考资料的来源:xubin341719[下面是该前辈的BT系列文章] 下载连接:Blu ...

  4. [转]1、蓝牙核心技术了解(蓝牙协议、架构、硬件和软件笔记)

    本文转自:http://www.cnblogs.com/zjutlitao/p/4742428.html 声明:这篇文章是楼主beautifulzzzz学习网上关于蓝牙的相关知识的笔记,其中比较多的受 ...

  5. 1、蓝牙核心技术了解(蓝牙协议、架构、硬件和软件笔记)

    原文地址:http://www.cnblogs.com/zjutlitao/p/4742428.html 声明:这篇文章是楼主beautifulzzzz学习网上关于蓝牙的相关知识的笔记,其中比较多的受 ...

  6. 蓝牙核心技术介绍(蓝牙协议、架构、硬件和软件笔记)

    原文地址:http://www.cnblogs.com/zjutlitao/p/4742428.html 声明:这篇文章是楼主beautifulzzzz学习网上关于蓝牙的相关知识的笔记,其中比较多的受 ...

  7. android蓝牙协议名词解释 OPP HFP HDP A2DP PAN

    各种蓝牙协议的全称: OPP:对象存储规范(Object Push Profile),最为常见的,文件的传输都是使用此协议. HFP:(Hands-free Profile),让蓝牙设备能够控制电话, ...

  8. 蓝牙(三)蓝牙协议的初始化

    介绍蓝牙协议的初始化之前首先要简单讲一下蓝牙一些常用协议以及各个协议的作用,同时还要讲以下Application的知识以便对蓝牙协议的初始化有一个更清晰的认识. 一.蓝牙协议 简介: HSP(手机规格 ...

  9. Android Bluetooth蓝牙开发\蓝牙协议\蓝牙通信例子_Android支持蓝牙4.0版本_BLE开发

    一.Android Bluetooth现状 在android官网可以了解到android4.2新增了部分新功能,但是对于BT熟悉的人或许开始头疼了,那就是Android4.2引入了一个新的蓝牙协议栈针 ...

  10. BlueTooth蓝牙协议管理(三)

    蓝牙协议是蓝牙设备间交换信息所应该遵守的规则.与开放系统互联(OSI)模型一样,蓝牙技术的协议体系也采用了分层结构,从底层到高层形成了蓝牙协议栈,各层协议定义了所完成的功能和使用数据分组格式,以保证蓝 ...

最新文章

  1. Python 类继承,__bases__, __mro__, super
  2. python修改html表格,使用styles和css更改pandas dataframe html表python中...
  3. Pycharm中运行Python代码的几种方式
  4. tankwar的java坦克子弹撞墙_tankwar
  5. VS2010团队开发调试器无法继续运行该进程,项目文件“”已被重命名或已不再解决方案中
  6. 流媒体地址文件制作方法
  7. Apache-ActiveMQ消息队列 — HelloWorld实例
  8. TP框架中session操作
  9. 【bat】 计算机清理原理,使用bat脚本清理系统垃圾的方法
  10. 装饰器模式Decorate
  11. gazebo仿真环境搭建+配置+小车运动仿真
  12. 2021年中国乳制品产量、营业收入、利润总额及进出口分析[图]
  13. 《Oracle PL/SQL程序设计(第5版)》一一2.4 执行必要的PL/SQL任务
  14. BQB认证CE认证介绍
  15. 更愿意思念更早的“金陵”
  16. 云服务系列文章(一) 阿里云和AWS
  17. 解决tensorflow 调用bug Running model failed:Invalid argument: NodeDef mentions attr 'dilations'
  18. utf8mb4_unicode_ci、utf8mb4_general_ci的区别总结
  19. 神经了的ODE:Neural Ordinary Differential Equations
  20. 自动驾驶系统入门(四) - 车载摄像头

热门文章

  1. OverFeat学习
  2. OKR案例: 回顾/复盘会流程模板
  3. 驻波比,功率计原理,短波机驻波测量
  4. Android逆向工程实例 -- 善领安卓版DSA APP手势操作bug修复
  5. 解决editormd不能显示emoji问题
  6. 【深入理解Java】一篇文章带你彻底吃透Java NIO
  7. Origin 2019b 64Bit 软件绘制出图的坐标刻度老是消失怎么解决
  8. 机器学习(4)——弱监督学习
  9. 巴伦变压器电路图_一文看懂巴伦(功能原理、性能参数、基本类型)
  10. RK3288 Android7.1软件开发指南