Android——搜索传统蓝牙设备
一,主布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:layout_weight="5" android:id="@+id/test_list_bluetooth" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> <LinearLayout android:layout_weight="0.2" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:layout_gravity="left" android:layout_margin="10dp" android:id="@+id/scan" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="扫描蓝牙设备" /> <Button android:id="@+id/btn_scan_ble" android:text="扫描BLE设备" android:layout_gravity="right" android:layout_margin="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_stopscan" android:text="停止扫描" android:layout_gravity="right" android:layout_margin="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>
二,列表Item
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_marginTop="20dp" android:layout_marginLeft="20dp" android:layout_marginBottom="20dp" android:layout_weight="1" android:hint="蓝牙名称" android:id="@+id/test_bluetooth_name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_marginTop="20dp" android:layout_marginLeft="20dp" android:layout_marginBottom="20dp" android:layout_weight="1" android:hint="蓝牙地址" android:id="@+id/test_bluetooth_addr" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:textColor="@color/txt_blue" android:layout_marginTop="20dp" android:layout_marginLeft="20dp" android:layout_marginBottom="20dp" android:layout_weight="1" android:hint="绑定状态" android:id="@+id/test_device_status" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
三,蓝牙权限配置
<uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
四,activity上代码
package com.woasis.batteries.activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothManager; import android.bluetooth.BluetoothSocket; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; import com.woasis.batteries.R; import com.woasis.batteries.lib.bluttoth.BluetoothData; import com.woasis.batteries.lib.bluttoth.BluetoothService; import java.io.IOError; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ListView mListView;//列表对象 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); List<Map<String,String>> deviceList;//列表数据源 SimpleAdapter listItemAdapter; BluetoothAdapter bluetoothAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.scan).setOnClickListener(this); findViewById(R.id.btn_stopscan).setOnClickListener(this); findViewById(R.id.btn_scan_ble).setOnClickListener(this); mListView=(ListView)findViewById(R.id.test_list_bluetooth); registerReceiver(mReceiver, filter); // bluetoothService = BluetoothService.getInstance(this, BluetoothService.BluetoothType.b4); // bluetoothService.setmBluetoothData(new BluetoothData("INVENT-7CEC7933","123")); } private Handler handler=new Handler(){ public void handleMessage(Message msg) { switch (msg.what) { case 0:/*停止扫描*/ listItemAdapter.notifyDataSetChanged(); Log.i("handler--0---收到消息:",deviceList.toString()); break; case 1:/*更新listview数据源*/ Bundle b =msg.getData(); String deviceName=b.getString("deviceName"); String deviceAddress=b.getString("deviceAddress"); Map map=new HashMap(); map.put("deviceName",deviceName); map.put("deviceAddress",deviceAddress); map.put("bluetooth_status","未配对"); boolean isAdd=false; for(Map m :deviceList){ if(m.get("deviceAddress")!=map.get("deviceAddress")){ isAdd=true; } } if(isAdd) { deviceList.add(map); } listItemAdapter.notifyDataSetChanged(); Log.i("handler--1---收到消息:",map.toString()); break; default: break; } } }; BluetoothService bluetoothService; @Override public void onClick(View v) { switch (v.getId()) { case R.id.scan: // bluetoothService.startBluetooth(); //1,初始化蓝牙适配器 final BluetoothManager bluetoothManager=(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); bluetoothAdapter= bluetoothManager.getAdapter(); //2,开启蓝牙 if(bluetoothAdapter==null || !bluetoothAdapter.isEnabled()){ Intent enableBtIntent=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent,1); } //3,扫描附近的设备 deviceList=new ArrayList<>(); if(bluetoothAdapter.isDiscovering()){ bluetoothAdapter.cancelDiscovery(); }else{ //每次扫描之前都先判断一下是否存在已久配对的设备 Set<BluetoothDevice> paireDevices=bluetoothAdapter.getBondedDevices(); if(paireDevices.size()>0){ for(BluetoothDevice device :paireDevices){ Map map=new HashMap(); map.put("deviceName",device.getName()); map.put("deviceAddress",device.getAddress()); map.put("bluetooth_status","已配对"); deviceList.add(map); } Log.i("之前已经绑定过的设备:",deviceList.toString()); } bluetoothAdapter.startDiscovery();//开始搜索 } /*数据绑定listView*/ if(deviceList!=null && deviceList.size()>0){ listItemAdapter=new SimpleAdapter(getBaseContext(),/*指明了SimpleAdapter关联的View的运行环境,也就是当前的Activity*/ deviceList,/*由Map组成的List,在List中的每条目对应ListView的一行,每一个Map中包含的就是所有在from参数中指定的key*/ R.layout.test_item_bluetooth_list,/*定义列表项的布局文件的资源ID,该资源文件至少应该包含在to参数中定义的ID*/ new String[]{"deviceName","deviceAddress","bluetooth_status"},/*将被添加到Map映射上的Key*/ new int[] {R.id.test_bluetooth_name,R.id.test_bluetooth_addr,R.id.test_device_status}/*将绑定数据的视图的Id跟from参数对应,这些被绑定的视图元素应该全是TextView*/ ); //设置适配器 mListView.setAdapter(listItemAdapter); } break; case R.id.btn_stopscan: Log.i("停止蓝牙扫描-------",String.valueOf(System.currentTimeMillis())); bluetoothAdapter.cancelDiscovery();//停止扫描 break; case R.id.btn_scan_ble:/*扫描BLE设备*/ break; default: break; } } /*监听扫描过程中的变化*/ private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override 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 // 通过EXTRA_DEVICE附加域来得到一个BluetoothDevice设备 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // If it's already paired, skip it, because it's been listed already // 如果这个设备是不曾配对过的,添加到list列表 if (device.getBondState() != BluetoothDevice.BOND_BONDED) { Message msg=new Message(); msg.what=1; Bundle bundle=new Bundle(); bundle.putString("deviceName",device.getName()); bundle.putString("deviceAddress",device.getAddress()); msg.setData(bundle); handler.sendMessage(msg); Map map=new HashMap(); map.put("deviceName",device.getName()); map.put("deviceAddress",device.getAddress()); Log.i("扫描到的新设备:",map.toString()); Log.i("加入新设备之后,扫描到的总设备:",deviceList.toString()); } // When discovery is finished, change the Activity title } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { Log.i("扫描结束------扫描到的总设备:",deviceList.toString()); handler.obtainMessage(0).sendToTarget(); } } }; }
Android——搜索传统蓝牙设备的更多相关文章
- Android - 传统蓝牙通信聊天
Android -传统蓝牙通信聊天 技术:java+Android4.4+jdk1.8 运行环境:Android4.4.Android7.0 概述 Android 传统蓝牙的使用,包括开关蓝牙.搜索设 ...
- android搜索框列表布局,流程及主要步骤思维导图
android搜索框列表布局,流程及主要步骤思维导图 android搜索框列表布局,流程及主要步骤思维导图 activity_coin_search.xml----------<com.scwa ...
- Android -传统蓝牙通信聊天
概述 Android 传统蓝牙的使用,包括开关蓝牙.搜索设备.蓝牙连接.通信等. 详细 代码下载:http://www.demodashi.com/demo/10676.html 原文地址: Andr ...
- 【转】android蓝牙开发 蓝牙设备的查找和连接
1. 首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限 // 管理蓝牙设备的权限 <uses-permissionandroid:name="android. ...
- Android搜索框效果
转载:http://blog.csdn.net/walker02/article/details/7917392 需求:项目中的有关搜索的地方,加上清空文字的功能,目的是为了增加用户体验,使用户删除文 ...
- Android中连接蓝牙设备时遇到createRfcommSocketToServiceRecord的UUID问题和BluetoothSocket的connect失败
[问题] 折腾: [记录]编写Android中的蓝牙模块驱动和底层HART设备 期间,参考: Bluetooth | Android Developers – ManagingAConnection ...
- Android搜索框以及内容提供器
先看结果: 相关的官方文档在这里:Creating a Search Interface Android官方提供了两种方式: 弹出一个Dialog,覆盖当前的Activity界面 在AppBar中扩展 ...
- Android搜索自动提示功能 AutocompleteTextView
1.配置main.xml中自动提示控件: <AutoCompleteTextView android:id="@+id/autotv_searchresult" androi ...
- Android搜索控件的基本使用方法
在Android中,搜索是一个非常核心的功能,我们可以通过它搜索到任意我们可以获得的信息.这些信息可以是存储在手机中的联系人.文件等信息,也可以是在网络上的资源. Android为了给用户提供良好的搜 ...
随机推荐
- 作为软件技术人员建立自己的git账户并保存资料的重要性
日常生活中,当修改并保存了一个文件,所得到的就是此文件的最新版本,假若今后因某一问题需要用到原来文件,可是很多情况下,这种修改是不可逆的.你修改完之后,无法回到你修改前的样子.为了避免这种情况,有的人 ...
- vue-router异步加载组件
export default { routes: [ { path: '/fund', name: 'FundManagement', component: function(resolve) { r ...
- bzoj3816 矩阵变换
Description 给出一个 N 行 M 列的矩阵A, 保证满足以下性质: M>N. 矩阵中每个数都是 [0,N] 中的自然数. 每行中, [1,N] 中每个自然数都恰好出现一次.这意味着每 ...
- [转]CUDA和OpenGL互操作的实现及分析
CUDA和OpenGL互操作的实现及分析刘进锋.郭雷(西北工业大学 自动化学院,陕西西安710129) 1 CUDA与OpenGL概述 OpenGL是图形硬件的软件接口,它是在SGI等多家世界著名的计 ...
- 一步一步部署SSIS包图解教程
本文就SQL统计分析SSIS包的部署进行一次详细的部署图解教程,Sql Server Integration Services 提供了非常简单的部署工具,利用这些工具可以方便地将包文件(*.dtsx) ...
- 【luogu P1640 [SCOI2010]连续攻击游戏】 题解
题目链接:https://www.luogu.org/problemnew/show/P1640 数据有点水吧,从属性值连向对应武器编号. 枚举属性值匹配,遇到第一个无法匹配的直接跳出就好惹~. #i ...
- TIDB2 —— 三篇文章了解 TiDB 技术内幕 - 说存储
原文地址:https://pingcap.com/blog-cn/tidb-internal-1/ 引言 数据库.操作系统和编译器并称为三大系统,可以说是整个计算机软件的基石.其中数据库更靠近应用层, ...
- Dubbo源码分析之ExtensionLoader加载过程解析
ExtensionLoader加载机制阅读: Dubbo的类加载机制是模仿jdk的spi加载机制: Jdk的SPI扩展加载机制:约定是当服务的提供者每增加一个接口的实现类时,需要在jar包的META ...
- App 分辨率相关 - iOS
针对现有 Apple 设备分辨率小归总,方便日常查看; 顺便推荐一款图片生成工具,个人感觉挺方便好用,放置一张高分辨率大图可自动生成一套配图,软件名称(App Icon Gear). 具体设备分辨率如 ...
- SQLSERVER SQL性能优化
1.选择最有效率的表名顺序(只在基于规则的优化器中有效) SQLSERVER的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving ta ...