• android: 建立和断开a2dp link 相关方法总结


    总结关于蓝牙A2DP 操作的一些相关方法和接口:

    1. 设置获取A2dp对象

        /**
         * 服务监听器,通过绑定服务获取BluetoothA2dp对象
         */
         private BluetoothA2dp mBluetoothA2dp;
    
        public class MyServiceListener implements BluetoothProfile.ServiceListener {
    
            @Override
            public void onServiceConnected(int profile, BluetoothProfile proxy) {
                LoggerUtils.d(TAG + "onServiceConnected()");
                /**
                 *  use reflect method to get the Hide method "connectToDevice" in BluetoothA2DP
                 */
                if (profile == BluetoothProfile.A2DP) {
                    mBluetoothA2dp = (BluetoothA2dp) proxy;
    
                }
            }
    
            @Override
            public void onServiceDisconnected(int profile) {
                LoggerUtils.d(TAG + "onServiceDisconnected  " + profile);
                if (profile == BluetoothProfile.A2DP) {
                    mBluetoothA2dp = null;
                }
            }
    
        sBluetoothAdapter.getProfileProxy(context, new MyServiceListener(), BluetoothProfile.A2DP);

    2. 判断A2DP link 是否已建立

     if (sBluetoothAdapter.getProfileConnectionState(BluetoothProfile.A2DP) == BluetoothProfile.STATE_CONNECTED) {
                return true;
     }

    3. 获取连接的A2DP 设备

     public BluetoothDevice getConnectedA2dp(BluetoothA2dp mBluetoothA2dp) {
            LoggerUtils.d(TAG + "getconnectedA2dp()");
            List<BluetoothDevice> connectedDevices = mBluetoothA2dp.getConnectedDevices();
            if (connectedDevices != null && connectedDevices.size() > 0) {
                BluetoothDevice device = connectedDevices.get(0);
                return device;
            }
            return null;
     }

    4. 蓝牙设备扫描 

    BluetoothAdapter sBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();   // 获取蓝牙适配器
    sBluetoothAdapter.isEnabled()                             // 判断手机蓝牙是否开启
    sBluetoothAdapter.enable();                              // 尝试开机手机蓝牙
    sBluetoothAdapter.startDiscovery();                          // 开启扫描蓝牙设备
    sBluetoothAdapter.cancelDiscovery();                         // 停止扫描蓝牙设备

    5. 注册监听蓝牙状态改变的一些通知

     public void register() {
            LoggerUtils.d(TAG + "register()");
            IntentFilter filter = new IntentFilter();
            //扫描action
            filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
            filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
            filter.addAction(BluetoothDevice.ACTION_FOUND);
            //配对监听
            filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
    //      filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
            filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
            filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
            filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);//A2dp状态改变
            MyApp.getContext().registerReceiver(MYBroadcast, filter);
     }

    6. 监听回调

    BroadcastReceiver MYBroadcast = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                /**
                 * 开始扫描
                 */
                if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_STARTED)) {
                    if (mDiscoveryListener == null) return;
                    bluetoothDevices.clear();
                    LoggerUtils.d(TAG + "ACTION_DISCOVERY_STARTED");
                    mDiscoveryListener.onScanStart();
    
                    /**
                     * 扫描结束
                     */
                } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
                    if (mDiscoveryListener == null) return;
                    mDiscoveryListener.onScanFinish();
    
                    discoveryTimes--;
    
                    if (bluetoothDevices.size() == 0 && discoveryTimes > 0) {
                        LoggerUtils.d(TAG + "==================");
                        startDiscovery(true);
                    } else {
                        discoveryTimes = 3;
                    }
                    LoggerUtils.d(TAG + "ACTION_DISCOVERY_FINISHED");
                    /**
                     * 发现设备
                     */
                } else if (action.equals(BluetoothDevice.ACTION_FOUND)) {
                    if (mDiscoveryListener == null) return;
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    mDiscoveryListener.onDeviceFound(device);
                    bluetoothDevices.add(device);
                    LoggerUtils.d(TAG + "ACTION_FOUND: " + device.getAddress() + "
    " + device.getName());
                    /**
                     * 绑定状态改变
                     */
                } else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {//绑定状态监听
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    if (device.getBondState() == BluetoothDevice.BOND_BONDED) {
                        connectToDevice();
                    }
                    /**
                     * 连接状态改变
                     */
                } else if (action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {
                    LoggerUtils.d(TAG + "ACTION_CONNECTION_STATE_CHANGED");
    
                    /**
                     * spp连接
                     */
                } else if (action.equals(BluetoothDevice.ACTION_ACL_CONNECTED)) {
    
                    LoggerUtils.d(TAG + "ACTION_ACL_CONNECTED");
    
                    /**
                     * spp断开连接
                     */
                } else if (action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED)) {
                    LoggerUtils.d(TAG + "ACTION_ACL_DISCONNECTED");
    
    
                    /**
                     * 断开请求
                     */
                } else if (action.equals(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED)) {
                    LoggerUtils.d(TAG + "ACTION_ACL_DISCONNECT_REQUESTED");
    
                    /**
                     * A2dp
                     */
                } else if (action.equals(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED)) {
                    int state = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, 0);
                    /**
                     * A2dp连接成功
                     */
                    if (state == BluetoothA2dp.STATE_CONNECTED) {
                        if (mBluetoothA2dp == null) return;
                        mLastBluetoothDevice = sBluetoothDevice;
                        sBluetoothDevice = getConnectedA2dpDevice(mBluetoothA2dp);
                        LoggerUtils.d(TAG + "onReceive: " + "A2dp的连接成功");
                        notifyConnectSuccess();
    //                        if(sJIElIManager != null && sJIElIManager.getFilePathItemList())
                        /**
                         * A2dp断开
                         */
                    } else if (state == BluetoothA2dp.STATE_DISCONNECTED) {
                        LoggerUtils.d(TAG + "onReceive: " + "A2dp断开");
                        notifyDisconnect();
                    }
                }
            }
        };

    7. 连接蓝牙

     public void connectToDevice() {
            LoggerUtils.d(TAG + "connectToDevice()");
            if (sBluetoothDevice == null) return;
            if (getBluetoothType() == 2) {
                LoggerUtils.d(TAG + "杰里蓝牙连接");
                switch (sBluetoothDevice.getBondState()) {
                    case BluetoothDevice.BOND_NONE:
    
                        boolean returnValue = createBond();//配对
                        if (returnValue) {
                            LoggerUtils.d(TAG + "配对成功");
                        } else {
                            LoggerUtils.d(TAG + "配对失败");
                        }
    
                        break;
                    case BluetoothDevice.BOND_BONDED:
                        try {
                            BluetoothSocket socket = device.createRfcommSocketToServiceRecord(DUUID);
    
                             Method method_connect = clazz.getMethod("connect", BluetoothDevice.class);
    
                            Boolean BooleanValue = (Boolean) method_connect.invoke(mBluetoothA2dp, mBluetoothDevice);
                            }
    
                        } catch (Exception e) {
                            e.printStackTrace();
                            LoggerUtils.d(TAG + "A2dp连接异常,reason = " + e.getCause());
                        }
                        break;
    
                }
            } 
      }

    8. 绑定设备

    public boolean createBond() {
            try {
                Method createBondMethod = BluetoothDevice.class.getMethod("createBond");
                Boolean returnValue = (Boolean) createBondMethod.invoke(sBluetoothDevice);
                return returnValue;
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
            return false;
     }

    9, 断开蓝牙

            try {
                     Method method_disconnect = clazz.getMethod("disconnect", BluetoothDevice.class);
                     Boolean BooleanValue = (Boolean) method_disconnect.invoke(mBluetoothA2dp, mBluetoothDevice);
    
                } catch (Exception e) {
                    e.printStackTrace();
                    LoggerUtils.d(TAG + "断开A2dp连接异常,reason = " + e.getMessage());
                }
                if (socket != null) {
                    try {
                        socket.close();
                        socket = null;
                        LoggerUtils.d(TAG + "断开spp socket成功");
                    } catch (IOException e) {
                        e.printStackTrace();
                        LoggerUtils.d(TAG + "断开spp socket异常,reason = " + e.getCause());
                    }
                }

    10. 解绑定设备

     public boolean removeBond() {
            try {
                Method removeBondMethod = BluetoothDevice.class.getMethod("removeBond");
                Boolean returnValue = (Boolean) removeBondMethod.invoke(sBluetoothDevice);
                return returnValue.booleanValue();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
            return false;
        }

    参考链接:

    1. Android蓝牙A2dp开发

  • 相关阅读:
    将Emacs Org mode用于GTD任务管理
    以Emacs Org mode为核心的任务管理方案
    Epson L4158打印机安装与配置
    使用wget命令下载网络资源
    Apt下载安装包时Hash校验和不符
    Deep Learning专栏--FFM+Recurrent Entity Network的端到端方案
    Deep Learning专栏--强化学习之从 Policy Gradient 到 A3C(3)
    Deep Learning专栏--强化学习之MDP、Bellman方程(1)
    Deep Learning基础--Softmax求导过程
    Deep Learning基础--随时间反向传播 (BackPropagation Through Time,BPTT)推导
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/14620749.html
Copyright © 2020-2023  润新知