蓝牙学习记录

蓝也开发中常用的类

1、BluetoothAdapter 代表本地的蓝牙设备;

2、BluetoothDevice 代表远程的蓝牙设;

3、BluetoothSocket 一种类似于TCP Socket的接口,这是让当前程序与其他程序通过蓝牙设备实现数据交换的切入点。通过流 InputStream 和OutputStream

4、BluetoothServerSocket 类似于ServerSocket 它用来监听接入请求,两个android程序要想链接在一起,必须通过这个类打开一个ServerSocket,当远程的蓝牙设备请求这个蓝牙设备的时候,如果请求被接受了,BluetoothServerSocket就返回一   个已经连接的 BluetoothSocket

权限问题

In order to use Bluetooth features in yourapplication, you need to declare at least one of two Bluetooth permissions: BLUETOOTHand BLUETOOTH_ADMIN.

 

你的程序中需要加入BLUETOOTH和BLUETOOTH ADMIN权限中的至少一个。

 

 

BLUETOOTH

public static final StringBLUETOOTH

Allows applications to connect to paired bluetooth devices

Constant Value: "android.permission.BLUETOOTH"

BLUETOOTH权限是用于蓝牙的交流,比如申请链接,接受连接,传输数据。

 

 

BLUETOOTH_ADMIN.

public static final StringBLUETOOTH_ADMIN

Allows applications to discover and pair bluetoothdevices

Constant Value: "android.permission.BLUETOOTH_ADMIN"

BLUETOOTH ADMIN 权限是用于初始化设备的搜索或改变蓝牙的设置,程序通过这个权限发现本地的蓝牙设备,如果你使用了BLUETOOTH ADMIN权限那么必须也要使用BLUETOOTH权限

 

 

开启蓝牙步骤:

1、获得BluetoothAdapter  通过静态方法getDefaultAdapter()获得蓝牙。这个方法返回当前设备的蓝牙适配器,你的程序可以通过这个蓝牙适配器和系统的蓝牙设备交互,如果返回的是null那么表示你的系统不支持蓝牙。

 

BluetoothAdaptermBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

if (mBluetoothAdapter == null) {

    // 设备不支持蓝牙

}

 

2、开启蓝牙 通过isEnabled()方法检查蓝牙是否开启,如果该方法返回false,表示蓝牙为开启,通过startActivityForResult()方法传一个ACTION_REQUEST_ENABLE行为的Intent来申请开启蓝牙。

if (!mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
 

扫描蓝牙设备

这是一个扫描的过程,一个本地范围蓝牙设备只有在它自身可见的状态才能够响应发现请求,它通过共享一些信息如设备名称,唯一的MAC地址来响应发现请求。通过这些信息本地蓝牙可以对被发现的蓝牙设备进行选择初始化连接。

 

一旦与别的蓝牙设备第一次连接建立,一个匹配请求会自动的呈现给用户。一旦匹配成功,那么就可以共享一些基本信息,设备名称、MAC地址等等,如果设备在一定范围之内,通过别的设备的MAC地址,能够在任意时候进行初始化连接而不需要再执行扫描了。

Remember there is a difference betweenbeing paired and being connected. To be paired means that two devices are awareof each other's existence, have a shared link-key that can be used forauthentication, and are capable of establishing an encrypted connection witheach other. To be connected means that the devices currently share an RFCOMMchannel and are able to transmit data with each other. The current AndroidBluetooth API's require devices to be paired before an RFCOMM connection can beestablished. (Pairing is automatically performed when you initiate an encryptedconnection with the Bluetooth APIs.)

匹配和连接是不同的,匹配表示两个设备彼此能够知道对方存在,共享link—key

连接表示设备现在共享一个RFCOMM通道能够彼此传输数据,现在的android蓝牙的API需要设备先匹配再建立RFCOMM连接。匹配是自动执行的

 

在设备扫描之前,有必要检查一下设备是否已经匹配过了。通过getBondedDevices()方法。它将会返回一个BuletoothDevice集合鄙视已经匹配过的设备。

Set pairedDevices = mBluetoothAdapter.getBondedDevices();
if (pairedDevices.size() > 0) {//有匹配过的设备
    for (BluetoothDevice device : pairedDevices) {
        // Add the name and address to an array adapter to show in a ListView
        mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
    }
}

扫描设备

扫描设备通过startDiscovery()方法执行,这个过程是同步的,该方法会立即返回伴随一个boolean值表示扫描是否成功的开始,扫描过程通常包括12秒。
 
你的程序必须注册一个BroadcastReceiver对于ACTION_FOUND Intent用来接收每一个被扫描到的设备的信息。对每一个设备,系统将会广播action_found Intent。这个Intent带有一个额外的字段EXTRA_DEVICE  EXTRA_CLASS,
// Create a BroadcastReceiver for ACTION_FOUND
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        // When discovery finds a device
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // Get the BluetoothDevice object from the Intent
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            // Add the name and address to an array adapter to show in a ListView
            mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
        }
    }
};
// Register the BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy
 
 
如果你想让你的蓝牙设备能够被其他的蓝牙设备扫描到就调用带有行为是ACTION_REQUEST_DISCOVERABLE的startActivityForResult(Intent,int)方法,该方法将通过系统设置是设备可被扫描,默认设备可被扫描时间是120秒,你可以通过EXTRA_DISCOVERABLE_DURATION的Intent改变这个时间,一个程序的最大值是 3600秒,0表示设备总是可被扫描的,小于0或大于3600都会被设定为120秒。
Intent discoverableIntent = new  Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
 



你可能感兴趣的:(Android)