开始第一天,着手这个项目的学习。

首先写一个简单的布局文件,包含三个按钮,一个listView列表显示搜索到的蓝牙

样式如图:

布局文件如下:

<?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"android:orientation="vertical"><Buttonandroid:id="@+id/turn_on"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="turn on"android:textAllCaps="false"/><Buttonandroid:id="@+id/turn_off"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="turn off"android:textAllCaps="false"/><Buttonandroid:id="@+id/search_button"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="search"android:textAllCaps="false"/><ListViewandroid:id="@+id/search_result"android:layout_width="match_parent"android:layout_height="wrap_content"></ListView></LinearLayout>

我将两个功能的代码暂写在MainActivity中,如下:

package com.example.hitmi.bluetoothtest;import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;import static android.app.PendingIntent.getActivity;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private static final int PERMISSION_REQUEST_COARSE_LOCATION = 1;private String TAG ="MainActivity";IntentFilter intentFilter;ListView listView;private List<String> bluetoothList = new ArrayList<String>();BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();ArrayAdapter<String> adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button turnOn = (Button)findViewById(R.id.turn_on);Button turnOff = (Button)findViewById(R.id.turn_off);Button search = (Button)findViewById(R.id.search_button);turnOn.setOnClickListener(this);turnOff.setOnClickListener(this);search.setOnClickListener(this);//安卓6以后使用蓝牙要用定位权限if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {// Android M Permission checkif (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);}}//蓝牙广播注册registerBluetooth();//listView布局加载adapter =new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,bluetoothList);listView = (ListView) findViewById(R.id.search_result);listView.setAdapter(adapter);//listView点击函数listClick();}//listView点击的实现void listClick(){listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {}});}//广播注册的实现void registerBluetooth(){// 设置广播信息过滤intentFilter = new IntentFilter();intentFilter.addAction(BluetoothDevice.ACTION_FOUND);intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);//注册广播registerReceiver(bluetoothReceiver, intentFilter);}//安卓6回调(有bug)@Overridepublic void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {switch (requestCode) {case PERMISSION_REQUEST_COARSE_LOCATION:if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {Log.d(TAG,"回调request");//TODO request success/}break;}}//button点击的实现@Overridepublic void onClick(View view){switch (view.getId()){case R.id.turn_on:{if(mBluetoothAdapter==null){Toast.makeText(this,"当前设备不支持蓝牙功能",Toast.LENGTH_SHORT).show();}if(!mBluetoothAdapter.isEnabled()){/* Intent i = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivity(i);*/mBluetoothAdapter.enable();}//开启被其它蓝牙设备发现的功能if (mBluetoothAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {Intent i = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);//设置为一直开启i.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 120);startActivity(i);}}break;case R.id.turn_off://break;case R.id.search_button:Log.d(TAG,"有点击search_button");if (bluetoothList==null||!bluetoothList.isEmpty())bluetoothList.clear();//如果当前在搜索,就先取消搜索if (mBluetoothAdapter.isDiscovering()) {mBluetoothAdapter.cancelDiscovery();}//开启搜索mBluetoothAdapter.startDiscovery();break;default:break;}}//注册销毁@Overrideprotected void onDestroy(){super.onDestroy();unregisterReceiver(bluetoothReceiver);}//蓝牙开始搜索的回调private BroadcastReceiver bluetoothReceiver = new BroadcastReceiver()  {public void onReceive(Context context, Intent intent) {String action = intent.getAction();Log.d(TAG,"有回调");if (action.equals(BluetoothDevice.ACTION_FOUND)) {BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);//已匹配的设备if (device.getBondState() == BluetoothDevice.BOND_BONDED) {//此处的adapter是列表的adapter,不是BluetoothAdapterbluetoothList.add(device.getName()+":"+device.getAddress()+"(已配对设备)");adapter.notifyDataSetChanged();}else {bluetoothList.add(device.getName()+":"+device.getAddress()+"(未配对设备)");adapter.notifyDataSetChanged();}} else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {Toast.makeText(MainActivity.this,"开始搜索",Toast.LENGTH_SHORT).show();} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {Toast.makeText(MainActivity.this,"搜索完毕",Toast.LENGTH_SHORT).show();}}};}

网上类似的代码很多,我重点讲两个问题

1.安卓6.0以后蓝牙使用权限要加上定位权限

在第一尝试写这个代码时,我copy的是网上有些年份的代码,没有加入定位权限,导致startDiscovery方法无法回调BroadcastReceiver,使得搜索功能一直无法实现。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {// Android M Permission checkif (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);}
}

这段代码是判断手机是不是6.0以上,是则要开定位权限

而我使用的的权限有:

    <uses-permission android:name="android.permission.BLUETOOTH"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

2.listView列表重复添加

在startDiscovery方法回调问题解决,listView能显示出蓝牙后我开开心心的蹦蹦跳跳的回家了。结果第二天一来一看,我去,重复添加了。这个时候我在搜索按钮的点击事件中判断listView是否为空,不为空则清空再搜索,代码如下:

                if (bluetoothList==null||!bluetoothList.isEmpty())bluetoothList.clear();

第一个功能写出来,迈出第一步——2019.01.03

-----------------------------------------------分割线---------------------------------------------

蓝牙打开和搜索并显示在列表相关推荐

  1. Android BLE与终端通信(二)——Android Bluetooth基础科普以及搜索蓝牙设备显示列表

    Android BLE与终端通信(二)--Android Bluetooth基础搜索蓝牙设备显示列表 摘要 第一篇算是个热身,这一片开始来写些硬菜了,这篇就是实际和蓝牙打交道了,所以要用到真机调试哟, ...

  2. Android BLE与终端通信(二)——Android Bluetooth基础搜索蓝牙设备显示列表

    Android BLE与终端通信(二)--Android Bluetooth基础搜索蓝牙设备显示列表 摘要 第一篇算是个热身,这一片开始来写些硬菜了,这篇就是实际和蓝牙打交道了,所以要用到真机调试哟, ...

  3. 传奇登陆器 link.html 网页无法显示,打开登陆器后无法显示游戏各区列表的问题...

    这个问题很多玩私服的朋友都会遇到过,就是我们在打开私服的登陆器后想要登陆时却无法显示游戏各区的列表,提示说获取列表失败.这是什么原因呢?如果无法获取游戏列表的话那我们就不能选择游戏区也就不能登陆了啊. ...

  4. Android蓝牙开发(一)之打开蓝牙和设备搜索

    Android蓝牙开发系列目录: https://blog.csdn.net/huangliniqng/article/details/82185635 一.判断是否系统是否支持蓝牙 在使用蓝牙之前, ...

  5. 【Android -- 蓝牙】打开蓝牙和设备搜索

    文章目录 一.清单文件中,声明蓝牙权限和定位权限 二.判断是否系统是否支持蓝牙 三.判断蓝牙是否打开 四.搜索设备 五.获取本地蓝牙属性 一.清单文件中,声明蓝牙权限和定位权限 <!--蓝牙权限 ...

  6. android蓝牙开发搜素,Android蓝牙开发(一)之打开蓝牙和设备搜索

    一.判断是否系统是否支持蓝牙 在使用蓝牙之前,我们首先要判断手机设备是否支持蓝牙,虽然现在基本都支持蓝牙了,但是为了代码的严谨性我们还是需要在代码中判断: private BluetoothManag ...

  7. android Ble4.0蓝牙开发之搜索慢、startLeScan()过时,6.0以上不需要定位权限也能快速搜索到蓝牙设备

    项目中需要用到android Ble蓝牙4.0开发技术,于是开启了蓝牙填坑之旅,说实话,蓝牙开发坑真多,跳出一个又进入下一个,每次遇到 问题,就觉得不可能解决了,还好在自己的摸索中,都一一的化解了,以 ...

  8. Vim清除最后一个搜索突出显示

    想要改善这篇文章吗? 提供此问题的详细答案,包括引文和为什么答案正确的解释. 答案不够详细的答案可能会被编辑或删除. 在Vim中进行搜索后,我将所有出现的事件突出显示. 如何禁用它? 我现在再次搜索找 ...

  9. 客户端出错:无法在数据表视图中显示该列表: 没有安装与 Windows SharePoint Services 兼容的数据表组件...

    P:客户端想在数据表中编辑时提示下列错误: 数据视图由于下列一个或多个原因,无法在数据表视图中显示该列表: 没有安装与 Windows SharePoint Services 兼容的数据表组件,浏览器 ...

最新文章

  1. Linux性能调优用这个“必杀技”,稳了!
  2. 最强大的GNN出现了!
  3. [译]ASP.NET Core 2.0 部分视图
  4. css expressionr,CSS Expression讲解
  5. java tree类子项的添加和删除_使用Java实现二叉树的添加,删除,获取以及遍历...
  6. 【风马一族_php】NO4_php基础知识
  7. C#类的属性遍历及属性值获取
  8. 小朋友学C++(1)
  9. 针对Linux ASP.NET MVC网站中 httpHandlers配置无效的解决方案
  10. 维持硒测试自动化的完美方法
  11. Weak Pair HDU - 5877 树状数组+离散化+DFS遍历
  12. 采用python解决实际问题_应用 Python 解决一些实际问题
  13. ui设计师就业前景怎么样?
  14. LUNA16数据集介绍
  15. python3 多线程 threading.local 代理_threading.local的作用?Python每日3题(多线程专题)...
  16. LVS+Redis部署手册
  17. 三星s20 android 10.0,三星S20猎户CPU系列安卓10.0 TWRP Recovery V3.4.0.10
  18. uniapp 基础框架模板
  19. 何为 Token?什么是基于 token 的认证?
  20. 独孤思维:没有复盘的项目,不会赚钱

热门文章

  1. 牛顿法和牛顿下山法求极值的理解
  2. 大型、超大型数据中心园区设计如何审查与优化
  3. MySQL的主从配置+SpringBoot的MySQL读写分离配置
  4. oracle 查询字符代码dump,字符集问题(Linux、oracle、终端等,导入导出数据)
  5. Cesium中gltf模型的坐标系
  6. Android使用高德地图地理围栏定位自动发送短信
  7. 【电脑系统】制作U盘启动盘(适用win)
  8. kubernetes--RBAC权限管理
  9. android 按键用户点击事件,Android按键事件处理过程详解
  10. Qt Jambi 4.8 快速入门