android7.0 蓝牙定位,BluetoothAdapter在Android6.0/7.0+以上startDiscovery不能发现蓝牙设备问题...

BluetoothAdapter在Android6.0+以上startDiscovery不能发现蓝牙设备问题

问题的重要原因之一是Android 6.0+,Android 7.0+的权限问题引起的。在Android 4.0+上运行良好的蓝牙代码,在高版本运行异常。比如BluetoothAdapter的startDiscovery虽然启动了发现蓝牙任务,但是不能发现蓝牙设备。解决问题是针对最新高版本的Android系统增加权限申请。现在给出一个完整例子。

activity_main.xml:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="zhangphil.bluetooth.MainActivity">

android:id="@+id/init"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="初始化蓝牙设备" />

android:id="@+id/discovery"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="发现设备" />

android:id="@+id/enable_discovery"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="使自身可被其他蓝牙设备发现" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/listView">

测试的MainActivity.java:

package zhangphil.bluetooth;

import android.Manifest;

import android.app.Activity;

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.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.ArrayAdapter;

import android.widget.ListView;

public class MainActivity extends Activity implements View.OnClickListener {

private final int REQUEST_ENABLE_BT = 0xa01;

private final int PERMISSION_REQUEST_COARSE_LOCATION = 0xb01;

private String TAG = "zhangphil";

private ArrayAdapter mAdapter;

private BluetoothAdapter mBluetoothAdapter;

// 广播接收发现蓝牙设备

private BroadcastReceiver mReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {

Log.d(TAG, "开始扫描...");

}

if (BluetoothDevice.ACTION_FOUND.equals(action)) {

BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

if (device != null) {

// 添加到ListView的Adapter。

mAdapter.add("设备名:" + device.getName() + "\n设备地址:" + device.getAddress());

mAdapter.notifyDataSetChanged();

}

}

if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {

Log.d(TAG, "扫描结束.");

}

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);

}

}

// 注册广播接收器。

// 接收蓝牙发现

IntentFilter filterFound = new IntentFilter(BluetoothDevice.ACTION_FOUND);

registerReceiver(mReceiver, filterFound);

IntentFilter filterStart = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED);

registerReceiver(mReceiver, filterStart);

IntentFilter filterFinish = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

registerReceiver(mReceiver, filterFinish);

mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, android.R.id.text1);

((ListView) findViewById(R.id.listView)).setAdapter(mAdapter);

findViewById(R.id.init).setOnClickListener(this);

findViewById(R.id.discovery).setOnClickListener(this);

findViewById(R.id.enable_discovery).setOnClickListener(this);

}

@Override

public void onClick(View view) {

switch (view.getId()) {

case R.id.init:

init();

case R.id.discovery:

discovery();

case R.id.enable_discovery:

enable_discovery();

}

}

// 初始化蓝牙设备

private void init() {

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

// 检查设备是否支持蓝牙设备

if (mBluetoothAdapter == null) {

Log.d(TAG, "设备不支持蓝牙");

// 不支持蓝牙,退出。

return;

}

// 如果用户的设备没有开启蓝牙,则弹出开启蓝牙设备的对话框,让用户开启蓝牙

if (!mBluetoothAdapter.isEnabled()) {

Log.d(TAG, "请求用户打开蓝牙");

Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);

// 接下去,在onActivityResult回调判断

}

}

// 启动蓝牙发现...

private void discovery() {

if (mBluetoothAdapter == null) {

init();

}

mBluetoothAdapter.startDiscovery();

}

// 可选方法,非必需

// 此方法使自身的蓝牙设备可以被其他蓝牙设备扫描到,

// 注意时间阈值。0 - 3600 秒。

// 通常设置时间为120秒。

private void enable_discovery() {

Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

// 第二个参数可设置的范围是0~3600秒,在此时间区间(窗口期)内可被发现

// 任何不在此区间的值都将被自动设置成120秒。

discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3600);

startActivity(discoverableIntent);

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (requestCode == REQUEST_ENABLE_BT) {

if (resultCode == RESULT_OK) {

Log.d(TAG, "打开蓝牙成功!");

}

if (resultCode == RESULT_CANCELED) {

Log.d(TAG, "放弃打开蓝牙!");

}

} else {

Log.d(TAG, "蓝牙异常!");

}

}

@Override

protected void onDestroy() {

super.onDestroy();

unregisterReceiver(mReceiver);

}

@Override

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {

switch (requestCode) {

case PERMISSION_REQUEST_COARSE_LOCATION:

if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

}

break;

}

}

}

不要忘记增加权限:

代码运行结果:

02809ed310155c049baca88f06f9f8bb.png

以上代码运行测试环境:硬件设备是三星S7Edge,Android版本:7.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

19年的华为手机还能搭载鸿蒙吗,2019年华为手机出货或超2.15亿部 鸿蒙系统最快10月首秀...

科客点评&#xff1a;备用方案可以说是越多越好&#xff0c;这样的确能有效避免突发事件所带来的巨大风险。6月13日&#xff0c;知名分析师郭明錤给出了有关华为的最新预测报告&#xff0c;该预测报告主要对华为手机今年的出货量进行了预测。根据分析师郭明錤的报告显示&#x…

html5如何新建定义站点,HTML5技术教程:创建新作品_HTML5教程_创建作品_添加元素_课课家...

我们所熟知的HTM5软件是一款非常强大功能的软件&#xff0c;据我了解HTM5软件的特色也是非常有优势的。我们先来介绍一下它的优势&#xff1a;HTML5可以提供:①&#xff1a;提高可用性和改进用户的友好体验;②&#xff1a;有几个新的标签&#xff0c;这将有主(助?)开发人员定义…

app inventor HTML5,[App Inventor] Web客戶端元件 POST 傳值的使用方式

過去在開發App時&#xff0c;Web客戶端元件大部份都以Get的方式進行值的傳遞。那可以用POST嗎&#xff1f;以下簡單的範例&#xff0c;我們將使用Web客戶端元件以POST的方式傳值給一個PHP程式&#xff0c;然後再返回結果顯示在App中。1. 如下圖我們新增一個專案&#xff0c;在工…

html安卓手机打开后只有半屏,宽度设置100%在移动端时变成一半

html代码&#xff1a;手机电脑DIY数码外设智能css代码&#xff1a;.nav-body{position: relative;overflow: hidden;width:100%;height: 400px;}.nav-img{position: absolute;z-index:-1;}.nav-img a{display: block;width:100%;}.nav-img img{height: 400px;width:100%;min-wi…

学计算机U盘内存,在U盘上设置虚拟内存

Zhenbo问答网络江湖小溪饭男人&#xff0c;是的&#xff0c;但是没有。VISTA可以使用U盘来提高性能的原因&#xff0c;必须首先了解3233363533e58685e5aeb9337。这种称为readyboost的技术不使用闪存作为内存&#xff0c;而只是一种加速硬盘读取的技术。硬盘在大容量存储和传输速…

手机uc新窗口打开的html标签,在电脑UC浏览器的新窗口页中如何打开书签

在电脑UC浏览器的新窗口页中如何打开书签UC浏览器是一个很不错的查询资料的软件&#xff0c;我们可以在UC浏览器的新标签页中打开书签&#xff0c;那么如何打开呢&#xff1f;小编就来为大家介绍一下吧。具体如下&#xff1a;1. 第一步&#xff0c;双击并打开UC浏览器软件。2. …

html5版堆糖,堆糖(Duitang)

堆糖的开发背景对于每天都要和互联网打交道的用户来说&#xff0c;在使用Chrome的过程中会遇到很多很多有用的内容&#xff0c;或是一篇文章或是一张图片&#xff0c;用户如果想要保存这些内容大部分都是直接下载到本地进行保存&#xff0c;但是随着电脑保存的内容越来越多&…

如何用计算机直接做工资表,超简单一招!用Excel十秒快速制作工资条

年中到了&#xff0c;财务部的同志们又该挠头了吧。现在很多企业都在使用excel做工资表。不过正如你所知道的&#xff0c;做好的工资表与发出的工资条之间总是少了一样很重要的东东——表头。为了搞定这个表头&#xff0c;各路大神可谓各显神通&#xff0c;比如有的用公式搞定&…

计算机数字媒体专业毕业论文,数字媒体艺术专业毕业论文

数字媒体艺术专业毕业论文简介:此栏目为数字媒体艺术和毕业论文和专业相关的范例,免费教你怎么写视觉传达设计专业考研提供有关参考文献资料。一、引言在社会经济不断发展的今天&#xff0c;人们对自身精神文化越来越重视&#xff0c;数字媒体艺术也得到了迅速发展&#xff0c;…

计算机二级旅游推广ppt,计算机二级PPT真题:制作旅游产品推广PPT

1.本节课我们进行讲解演示文稿题&#xff0c;我们先来看一下题目如图所示。2.我们新建一个PPT&#xff0c;然后我们进行插入我们的ppt素材如图所示保存文件。3.接下来我们看一下第二小题如图所示。4.我们点击【设计】点击【浏览主题】找到我们的主题进行应用。5.接下来我们进行…

计算机二级vb2003年4月考试题,2003年4月全国计算机等级考试二级vb笔试真题附答案...

2003年4月全国计算机等级考试二级vb笔试真题附答案 (19页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;15.9 积分2003年4月全国计算机等级考试二级VB语言笔试试题及答案  一、选择题((1)一(20)每小…

如果计算机丢失了OL,win10玩守望先锋提示你的渲染设备已经丢失如何解决

一位用户反馈自己在 windows10系统 电脑中运行守望先锋时&#xff0c;遇到提示“你的渲染设备已经丢失 程序即将关闭”&#xff0c;这是怎么回事呢&#xff1f;出现这样的提示首先要确保自己的显卡是否符合游戏运行要求。接下来&#xff0c;就随小编一起看看该问题的具体解决方…

云服务器的发展历程,盘点微软Azure云服务器的发展历程

盘点微软Azure云服务器的发展历程盘点微软Azure云服务器的发展历程最近有一个笑谈讲道&#xff1a;如果微软有负责改名的部门&#xff0c;那将会是最忙碌的部门。昨天晚上有消息传出&#xff0c;微软将会把旗下云服务“Windows Azure”更名为“Microsoft Azure”&#xff0c;并…

【数据结构入门精讲 | 第十八篇】考研408、企业面试图专项练习(一)

在上一篇中我们学习了图的相关知识点&#xff0c;在这一篇中我们进行图的专项练习。 目录 判断题选择题编程题R7-1 社交网络图中结点的“重要性”计算R7-2 列出连通集R7-3 分而治之 判断题 1 选择两城市间最经济的航行路线用迪杰斯特拉算法&#xff08;对&#xff09;2 从某…

centos系统服务器关机,centos 7 重启服务器

centos 7 重启服务器 内容精选换一换本节操作介绍Linux操作系统云服务器在单用户模式下重置密码的操作步骤。本文档适用于X86架构的弹性云服务器。进入单用户模式下重置root密码前请先做好数据备份。请根据操作系统类型选择操作步骤&#xff1a;CentOS 8系列CentOS 7/EulerOS 系…

Nmap云主机端口扫描

Nmap云主机端口扫描 前言 一、nmap简介 Nmap是一个网络连接端扫描软件&#xff0c;用来扫描网上电脑开放的网络连接端。确定哪服务运行在那些连接端&#xff0c;并且推断哪个操作系统计算机运行(这是亦称fingerprinting)。 它是网络管理员必用的软件之一&#xff0c;以及用以评…

云存储技术-Zookeeper集群的安装

云存储技术 实验目的要求&#xff1a; 1、掌握在完全分布模式的整合平台中Zookeeper的安全分布模式的安装 2、完成Zookeeper的完全分布模式的安装 3、Zookeeper服务能够正常启动和连接 4、Zookeeper控制台能够正常进入 5、Zookeeper控制台命令能够正常使用 实验环境 &#xf…

云存储技术-JDK的安装

云存储技术-JDK的安装 实验目的要求&#xff1a; 1、掌握在完全分布模式的整合平台中快捷的进行JDK的安装和验证 2、在集群中所有主机上完成JDK的安装 3、所有主机上JDK相关命令能够正常使用 实验环境&#xff1a; 1、五台独立PC机或虚拟机 2、主机之间有有效的网络连接 3、每…

go 字符串转日期_Go技术日报(20200831)

go 语言中文网(每日资讯)_2020-08-31一、Go 语言中文网动态作用域&#xff1f;Dave Cheney 大神由 Go 单元测试惯用形式所想Go 实战&#xff1a;实现一个简单的日志库Go&#xff1a;基于 HTTP Header 传输签名参数二、亚军进化史Go 技术日报(2020-08-30)三、polarisxu为 jinzhu…

Linux相关配置 集群免密码登录配置

Linux相关配置 集群免密码登录配置 实验目的要求&#xff1a; 1、完成VMware Workstation安装&#xff0c;会应用相关操作 2、掌握虚拟机中Linux CentOS 7.4操作系统安装 3、完成静态网络地址的配置&#xff0c;所有主机的网络能够正常使用&#xff0c;相互之间能够正常连接 4…