Android 蓝牙API详解和连接使用

1.蓝牙开发有两个主要的API

BuletoothAdapter:本地蓝牙的适配器,也就是说当前应用程序所运行的Android设备上的蓝牙

BuletoothDevice  : 远程的蓝牙适配器,也就是说你要连接的Android设备的适配器。

2.蓝牙权限 :

android.permission.BLUETOOTH : 允许程序连接到已配对的蓝牙设备, 请求连接/接收连接/传输数据需要改权限, 主要用于对配对后进行操作;

android.permission.BLUETOOTH_ADMIN : 允许程序发现和配对蓝牙设备, 该权限用来管理蓝牙设备, 有了这个权限, 应用才能使用本机的蓝牙设备, 主要用于对配对前的操作;

优先级 : BLUETOOTH权限是BLUETOOTH_ADMIN权限的前提, 如果没有BLUETOOTH权限, 就不能使用BLUETOOTH_ADMIN权限;

3.蓝牙状态值:

蓝牙关闭 : int STATE_OFF , 值为10, 蓝牙模块处于关闭状态;

蓝牙打开中 : int STATE_TURNING_ON , 值为11, 蓝牙模块正在打开;

蓝牙开启 : int STATE_ON , 值为12, 蓝牙模块处于开启状态;

蓝牙开启中 : int STATE_TURNING_OFF , 值为13, 蓝牙模块正在关闭;

4.蓝牙相关的广播:

开关状态改变:

BluetoothAdapter.ACTION_STATE_CHANGE:

可以通过intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)获取当前蓝牙改变的状态。

搜索到附近可用设备:

BluetoothDevice.ACTION_FOUND:

可以通过intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 获取当前搜索到的远程设备。

配对请求:

BluetoothDevice.ACTION_PAIRING_REQUEST

5.常用方法:

BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter(); //获取本地蓝牙实例

开始 / 停止 扫描附近的设备:

mAdapter.startDiscovery(); 

获取蓝牙基本信息:

MAC地址:mAdapter.getAddress();

名称:      mAdapter.getName();

6.使用方法

6.1配置权限


android:name="android.permission.BLUETOOTH_ADMIN"/>

android:name="android.permission.BLUETOOTH_ADMIN"/>
android:name="android.permission.BLUETOOTH"/>

android:name="android.permission.ACCESS_COARSE_LOCATION"/>
android:name="andriod.permission.ACCESS_FINE_LOCATION"/>

6.2主要的使用方法,使用到有序广播

// 检查当前手机是否支持ble 蓝牙,如果不支持退出程序
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
    Log.e("=======开始进来=======", "检查当前手机不支持蓝牙");
    Toast.makeText(this, "检查当前手机不支持蓝牙", Toast.LENGTH_SHORT).show();
    finish();
}

// 初始化 Bluetooth adapter, 通过蓝牙管理器得到一个参考蓝牙适配器(API必须在以上android4.3或以上和版本)
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();

// 检查设备上是否支持蓝牙
if (mBluetoothAdapter == null) {
    Log.e("=======开始进来=======", "mBluetoothAdapter=" + mBluetoothAdapter);
    Toast.makeText(this, "检查当前手机不支持蓝牙", Toast.LENGTH_SHORT).show();
    finish();
    return;
}
@Override
public void onReceive(Context context, Intent intent) {
    action = intent.getAction(); //得到action
    Log.e("===action:===", "[" + action + "]");
    if (intent.getAction().equals(BluetoothDevice.ACTION_FOUND)) {
        // Intent中获取设备对象
        btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        Log.e("===发现设备:===", "[" + btDevice.getName() + "]" + ":" + btDevice.getAddress());
        if (mLDevices.size() == 0 && !btDevice.getName().equals("null"))
            mLDevices.add(btDevice);
        else if (!mLDevices.contains(btDevice) && btDevice.getName() != null)
            mLDevices.add(btDevice);
        if (mLDevices.size() == 0) {
            rl_fail.setVisibility(View.VISIBLE);
        } else {
            pairingKey = String.valueOf(intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_KEY, BluetoothDevice.ERROR));
            rl_success.setVisibility(View.VISIBLE);
            loadData();
        }
    } else if (intent.getAction().equals(BluetoothDevice.ACTION_FOUND)) {
        sePairingRequest(btDevice);
    }
}
private void setFound(BluetoothDevice bDevice) {
    /**
     * 发现设备
     */
    if (BluetoothDevice.ACTION_FOUND.equals(action)) {
        Log.e("===发现设备:===", "[" + bDevice.getName() + "]" + ":" + bDevice.getAddress());
        /**
         * 设备如果有多个,第一个搜到的那个会被尝试。
         */
        if (bDevice.getName() != null && bDevice.getName().contains(BLUETOOTHNAME)) {
            if (bDevice.getBondState() == BluetoothDevice.BOND_NONE) {

                Log.e("===ywq===", "attemp to bond:" + "[" + bDevice.getName() + "]");
                try {
                    //通过工具类ClsUtils,调用createBond方法
                    btDevice = bDevice;
                    ClsUtils.createBond(bDevice.getClass(), bDevice);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        } else
            Log.e("===error===", "Is faild");
    }
}

private void sePairingRequest(BluetoothDevice bDevice) {
    if (action.equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) { //再次得到的action,会等于PAIRING_REQUEST
        Log.e("===action2===", action);
        if (bDevice.getName().contains("iPhone")) {
            Log.e("===here===", "OKOKOK");
            try {
                //1.确认配对
                ClsUtils.setPairingConfirmation(bDevice.getClass(), bDevice, true);
                //2.调用setPin方法进行配对...
                boolean ret = ClsUtils.setPin(bDevice.getClass(), bDevice, String.valueOf(pairingKey));
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else
            Log.e("提示信息===", "这个设备不是目标蓝牙设备");
    }
}

Demo下载地址:https://download.csdn.net/download/qq_39735504/10324973

你可能感兴趣的:(Android 蓝牙API详解和连接使用)