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为了给用户提供良好的搜 ...
随机推荐
- 科技巨头之微软-Microsoft
提起微软Microsoft,我想应该是无人不知无人不晓.Windows操作系统,Office办公软件,是我们日常经常用到的工具.而微软的创始人正是前世界首富比尔盖茨. 1997年,我刚上初中.当时学校 ...
- 新手理解HTML、CSS、javascript之间的关系-修订
几年前写过一篇博文 <新手理解HTML.CSS.javascript之间的关系>,没想到网上出现了不少转载,当时没有太用心,里面的很多内容有待商榷,这里发布重新发布一篇. 网页主要有三部分 ...
- LeetCode: Recover Binary Search Tree [099]
[题目] Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without cha ...
- 最短路算法 —— Dijkstra算法
用途: 解决单源最短路径问题(已固定一个起点,求它到其他所有点的最短路问题) 算法核心(广搜): (1)确定的与起点相邻的点的最短距离,再根据已确定最短距离的点更新其他与之相邻的点的最短距离. (2) ...
- [18/11/20]break与continue的区别
一.普通break 和continue 1.break: break用于强行退出循环,不执行循环中剩余的语句. 2.continue continue 语句用在循环语句体中,用于终止某次循环过程,即跳 ...
- java实现按拼音排序
List<WaPayFileVO> list =(List<WaPayFileVO>) dao.execQueryBeanList(pagesql, params.toArra ...
- idea连接sqlite
首先下载驱动 官网链接:http://mvnrepository.com/artifact/org.xerial/sqlite-jdbc 打开idea 第一步:右边 数据源 (如果没有显示单击这里,有 ...
- 【题解】洛谷P1350 车的放置(矩阵公式推导)
洛谷P1350:https://www.luogu.org/problemnew/show/P1350 思路 把矩阵分为上下两块N与M 放在N中的有i辆车 则放在M中有k-i辆车 N的长为a 宽为 ...
- SpringBoot非官方教程 | 第二十篇: 处理表单提交
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot-form/ 本文出自方志朋的博客 这篇文件主要介 ...
- Python基础—13-面向对象及异常处理
面向对象及异常处理 内置函数 总结:__init__.__del__.__str__.attr系列.item系列.__call__ __str__与__repr__ 使用print/str方法时会自动 ...