由于代码量大,这次只写搜索,以后接着写连接和发送数据。
1,界面上只有一个按钮和一个listview
//开始服务
intentService = new Intent(MainActivity.this,BLEService.class);
startService(intentService);
// 初始化蓝牙
BluetoothController.getInstance().initBLE();
下面是initBle方法,初始化蓝牙,注释要看哦。
/**
* 初始化蓝牙
* @return
*/
public boolean initBLE(){
//检查当前手机是否支持ble 蓝牙,如果不支持退出程序
//App.app可能会报错,清单文件中不要忘了配置application
if (!App.app.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
return false;
}
// 初始化 Bluetooth adapter, 通过蓝牙管理器得到一个参考蓝牙适配器(API必须在以上android4.3或以上版本)
final BluetoothManager bluetoothManager = (BluetoothManager) App.app.getSystemService(Context.BLUETOOTH_SERVICE);
bleAdapter = bluetoothManager.getAdapter();
// 检查设备上是否支持蓝牙
if (bleAdapter == null) return false;
else return true;
}
search = (Button) findViewById(R.id.btn_search);
search.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if(!BluetoothController.getInstance().initBLE()){//手机不支持蓝牙
Toast.makeText(MainActivity.this, "您的手机不支持蓝牙",
Toast.LENGTH_SHORT).show();
return;//手机不支持蓝牙就啥也不用干了,关电脑睡觉去吧
}
if (!BluetoothController.getInstance().isBleOpen()) {// 如果蓝牙还没有打开
Toast.makeText(MainActivity.this, "请打开蓝牙",
Toast.LENGTH_SHORT).show();
return;
}
new GetDataTask().execute();// 搜索任务
}
});
private class GetDataTask extends AsyncTask {
@Override
protected String[] doInBackground(Void... params) {
if(BluetoothController.getInstance().isBleOpen()){
BluetoothController.getInstance().startScanBLE();
};// 开始扫描
return null;
}
@Override
protected void onPostExecute(String[] result) {
super.onPostExecute(result);
}
}
不要忘了注册service和广播receiver
/**
* 开始扫描蓝牙
*/
public void startScanBLE(){
bleAdapter.startLeScan(bleScanCallback);
if(serviceHandler!=null)
serviceHandler.sendEmptyMessageDelayed(ConstantUtils.WM_STOP_SCAN_BLE, 5000);
}
bleScanCallback是搜索成功后的回调,搜索成功后发消息给service,让它发广播更新界面
/**
* 搜索蓝牙回调
*/
BluetoothAdapter.LeScanCallback bleScanCallback =new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(BluetoothDevice device, int arg1, byte[] arg2) {
// device就是搜索到的设备
String name=device.getName();
if(name==null) return;
if(BluetoothController.this.serviceHandler!=null&&!name.isEmpty()){
Message msg=new Message();
msg.what=ConstantUtils.WM_UPDATE_BLE_LIST;
msg.obj=device;
BluetoothController.this.serviceHandler.sendMessage(msg);
}
}
};
其中的serviceHandler是在service中初始化的,所以它会发消息到service中。
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case ConstantUtils.WM_STOP_SCAN_BLE://搜索5秒后停止搜索
bleCtrl.stopScanBLE();
break;
case ConstantUtils.WM_UPDATE_BLE_LIST://回调发来的更新列表消息
//更新蓝牙列表广播
Intent intent=new Intent(ConstantUtils.ACTION_UPDATE_DEVICE_LIST);
BluetoothDevice device=(BluetoothDevice)msg.obj;
intent.putExtra("name",device.getName());
intent.putExtra("address", device.getAddress());
sendBroadcast(new Intent(intent));
break;
}
}
};
5,
MainActivity
收到更新列表的消息后更新列表,更新列表时一定要先判断
Listview
中是否已经有那个设备了,否则会搜的很多次那个设备,然后你的手机就卡了,说不定还要害你重启手机呢,至少得关了这个app了。
public class MsgReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equalsIgnoreCase(
ConstantUtils.ACTION_UPDATE_DEVICE_LIST)) {
String name = intent.getStringExtra("name");
String address = intent.getStringExtra("address");
boolean found=false;//记录该条记录是否已在list中,
for(EntityDevice device:list){
if(device.getAddress().equals(address)){
found=true;
break;
}
}// for
if(!found){
EntityDevice temp = new EntityDevice();
temp.setName(name);
temp.setAddress(address);
list.add(temp);
adapter.notifyDataSetChanged();
}
}
}
}
我们的实体类,暂存设备
public class EntityDevice {
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
一定要注意:
1,这是蓝牙和串口连接,不是和另外一个手机的蓝牙连接。
2,由于安卓6.0以上的权限管理问题,需要以下三个权限(6.0以前只要后两个就可以):
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
完整代码链接:
http://pan.baidu.com/s/1mi71vWO