第一步 声明蓝牙权限
一、要在应用程序中使用蓝牙功能,必须声明蓝牙的使用权限:BLUETOOTH和BLUETOOTH_ADMIN
1、BLUETOOTH
必须请求BLUETOOTH权限才能够使用蓝牙通信,进而请求连接、接收连接、传输数据
2、BLUETOOTH_ADMIN
必须请求BLUETOOTH_ADMIN才能够初始化device discovery或者管理蓝牙设置(Bluetooth settings)。
大多数应用程序必须具有这个权限才能够发现本地蓝牙设备,这个权限保护的其他能力(除了发现本地设备)不应该被使用,除非你的应用程序是在用户请求的时候能够修改蓝牙设置的管理者。
二、注意:如果你想要使用BLUETOOTH_ADMIN权限,那么你首先必须有BLUETOOTH权限。
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.BLUETOOTH" />
第二步 获取本地的蓝牙设备-BluetoothAdapter
任何蓝牙activity都需要BluetoothAdapter类。使用静态方法getDefaultAdapter()获得一个BluetoothAdapter的实例,这代表了设备本身的蓝牙适配器(the Bluetooth radio)。整个系统只有一个蓝牙适配器,你的程序可以通过获取到BluetoothAdapter实例与之交互。如果getDefaultAdapter()方法返回null则说明你的设备不支持蓝牙。
实例代码如下:
BluetoothAdapter adapter=BluetoothAdapter.getDefaultAdapter();//判断BluetoothAdapter对象是否为空,如果为空,则表明本机没有蓝牙设备 if(adapter !=null){ System.out.println("本机拥有蓝牙设备"); } else{ System.out.println("没有蓝牙设备"); }第三步 调用isEnabled()方法,打开蓝牙
接下来,你必须确保用户启动了蓝牙。调用isEnabled()方法来检查当前蓝牙是否启动。如果该方法返回false,那么说明蓝牙没有启动。这时需要使用“ACTION_REQUEST_ENABLE”action Intent作为参数,调用startActivityForResult()方法来请求启动蓝牙。这将通过系统设备来发出启动蓝牙的请求(不会停止你的程序)。
执行如上的代码将会弹出一个对话框,请求启动蓝牙的用户权限。如果用户点击“Yes”按钮,那么系统将开始启动蓝牙,启动蓝牙(有可能失败)之后你的程序将重新获得焦点。
实例代码如下:
<span style="font-size:14px;"> //调用isEnabled()方法,判断当前蓝牙设备是否可用 if(!adapter.isEnabled()){ //创建一个intent对象,该对象用于启动一个Activity,提示用户开启蓝牙设备 Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivity(intent); //不做提示,强行打开 // mAdapter.enable(); }</span>第四步 查询手机上已配对的蓝牙设备
//得到所有已配对的蓝牙适配器对象 Set<BluetoothDevice> devices = adapter.getBondedDevices(); if(devices.size()>0){ for(Iterator iterator = devices.iterator();iterator.hasNext();){ BluetoothDevice bluetoothDevice = (BluetoothDevice) iterator.next(); //得到远程已配对蓝牙设备的mac地址 System.out.println(bluetoothDevice.getAddress()); }为了建立一个连接,需要才能够BluetoothDevice对象中获取的是MAC地址。在这个例子中,MAC地址作为显示给用户的ArrayAdapter的一部分存储。只要有需要,可以把MAC地址提取出来。
第五步 搜索可用的蓝牙设备
1)刚才说过了mAdapter.startDiscovery()
是第一步,可以你会发现没有返回的蓝牙设备,怎么知道查找到了呢?向下看,不要急
2)定义BroadcastReceiver,关于BroadcastReceiver不多讲了,不是今天的讨论内容,代码如下
BroadcastReceiver mReceiver = new BroadcastReceiver() { <span style="white-space:pre"> </span>public void onReceive(Context context, Intent intent) { <span style="white-space:pre"> </span>String action = intent.getAction(); //找到设备 <span style="white-space:pre"> </span>if (BluetoothDevice.ACTION_FOUND.equals(action)) { <span style="white-space:pre"> </span>BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); <span style="white-space:pre"> </span>if (device.getBondState() != BluetoothDevice.BOND_BONDED) { <span style="white-space:pre"> </span>Log.v(TAG, "find device:" + device.getName()+ device.getAddress()); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} //搜索完成 else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { <span style="white-space:pre"> </span>setTitle("搜索完成"); <span style="white-space:pre"> </span>if (mNewDevicesAdapter.getCount() == 0) { <span style="white-space:pre"> </span>Log.v(TAG,"find over"); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>//执行更新列表的代码 <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>};
这样,没当查找到新设备或是搜索完成,相应的操作都在上段代码的两个if里执行了,不过前提是你要先注册
BroadcastReceiver,具体代码如下
<span style="font-size:14px;"><span style="white-space:pre"> </span>IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); <span style="white-space:pre"> </span>registerReceiver(mReceiver, filter); <span style="white-space:pre"> </span>filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); <span style="white-space:pre"> </span>registerReceiver(mReceiver, filter);</span>(这段代码,一般写在onCreate()里..)