手把手教你Android手机与BLE终端通信--搜索
来源:互联网 发布:王陆807和语料库 知乎 编辑:程序博客网 时间:2024/05/29 02:21
由于代码量大,这次只写搜索,以后接着写连接和发送数据。
下面是initBle方法,初始化蓝牙,注释要看哦。
3,点击MainActivity搜索按钮开启异步任务,调用搜索方法
异步任务中只有一句,开始搜索
4,初始化,搜索等蓝牙操作都在controller类中。搜索代码中设置5秒后停止搜索,搜索成功回调中发消息给service, service发广播给MainActivity更新listview. bleScanCallback是搜索成功后的回调,搜索成功后发消息给service,让它发广播更新界面
其中的serviceHandler是在service中初始化的,所以它会发消息到service中。
5, MainActivity收到更新列表的消息后更新列表,更新列表时一定要先判断Listview中是否已经有那个设备了,否则会搜的很多次那个设备,然后你的手机就卡了,说不定还要害你重启手机呢,至少得关了这个app了。
不要忘了注册和注销这个receiver
1,界面上只有一个按钮和一个listview
- <?xml version="1.0" encoding="UTF-8"?>
- <RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="#ffff"
- >
- <Button
- android:id="@+id/btn_search"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="搜索"
- android:layout_marginTop="40dp"
- android:layout_marginLeft="40dp"
- android:background="@null"
- android:textColor="#ff2222ff"
- android:textSize="32sp"/>
- <ListView android:id="@+id/list_devices"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="20dp"
- android:layout_below="@id/btn_search"
- android:layout_marginLeft="40dp">
- </ListView>
- </RelativeLayout>
- //开始服务
- intentService = new Intent(MainActivity.this,BLEService.class);
- startService(intentService);
- // 初始化蓝牙
- BluetoothController.getInstance().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;
- }
3,点击MainActivity搜索按钮开启异步任务,调用搜索方法
- 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<Void, Void, String[]> {
- @Override
- protected String[] doInBackground(Void... params) {
- if(BluetoothController.getInstance().isBleOpen()){
- BluetoothController.getInstance().startScanBLE();
- };// 开始扫描
- return null;
- }
- @Override
- protected void onPostExecute(String[] result) {
- super.onPostExecute(result);
- }
- }
4,初始化,搜索等蓝牙操作都在controller类中。搜索代码中设置5秒后停止搜索,搜索成功回调中发消息给service, service发广播给MainActivity更新listview.
不要忘了注册service和广播receiver
- /**
- * 开始扫描蓝牙
- */
- public void startScanBLE(){
- bleAdapter.startLeScan(bleScanCallback);
- if(serviceHandler!=null)
- serviceHandler.sendEmptyMessageDelayed(ConstantUtils.WM_STOP_SCAN_BLE, 5000);
- }
- /**
- * 搜索蓝牙回调
- */
- 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);
- }
- }
- };
- 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;
- }
- }
- };
- 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();
- }
- }
- }
- }
不要忘了注册和注销这个receiver
我们的实体类,暂存设备
- 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
阅读全文
0 0
- 手把手教你Android手机与BLE终端通信--搜索
- 手把手教你Android手机与BLE终端通信--搜索
- 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
- 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
- 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
- Android手机与BLE终端通信
- Android BLE开发之Android手机与BLE终端通信
- Android BLE开发之Android手机与BLE终端通信
- Android BLE开发之Android手机与BLE终端通信
- Android BLE开发之Android手机与BLE终端通信
- Android BLE开发之Android手机与BLE终端通信
- Android BLE开发之Android手机与BLE终端通信
- Android提高之Android手机与BLE终端通信
- 【转】Android BLE开发之Android手机与BLE终端通信
- Android BLE开发——Android手机与BLE终端通信初识
- Android BLE蓝牙4.0开发—Android手机与BLE终端通信
- Android BLE开发之Android手机与BLE终端通信的几篇文章
- Android BLE开发——Android手机与BLE终端通信初识
- python学习十(多继承,多态,异常)
- Mybatis--更新
- Balanced Numbers 数位DP+3进制压缩
- 调用百度翻译接口demo(完整ajax请求)
- windows下使用pthread
- 手把手教你Android手机与BLE终端通信--搜索
- 用quartz进行定时任务的开发
- 系统监控工具
- 在进行C#编程时候,有的时候我们需要判断一个字符串是否是数字字符串,我们可以通过以下两种方法来实现。 【方法一】:使用 try{} catch{} 语句。 我们可以在try语句块中试图
- 第 8 章 查找
- poj2528(线段树区间染色)
- 学习 视频压缩:I帧、P帧、B帧
- iOS 开发技巧之 ---- 使用Mac上的Safari对UIWebView进行调试
- HTML5新增属性介绍和地理位置