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,一经查实,立即删除!

相关文章

android xml defaulthandler解析,sax解析xml文件的DefaultHandler处理类

一千年的时光&#xff0c;我无数次掀起岁月的帷幔&#xff0c;只为和你&#xff0c;在某一个平静如水的日子相遇&#xff0c;然后相识&#xff0c;倾情一生&#xff0c;缱绻一世&#xff0c;好美的散文&#xff0c;好吧&#xff0c;我情愿把这个“你”当作android&#xff1b;)…

android中viewpager+fragment,Android开发之ViewPager+Fragment

使用步骤1、Activity的布局文件android:id"id/viewpager"android:layout_width"wrap_content"android:layout_height"wrap_content"android:layout_gravity"center" >2、加载要显示的Fragment&#xff0c;这里要注意&#xff0c;导…

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

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

android 活动传递数据,如何在Android应用程序的“活动”之间传递数据?

我有一种情况&#xff0c;在通过登录页面登录后&#xff0c;每个activity上都会有一个退出button 。点击sign-out &#xff0c;我将传递已登录用户的session id以便退出。 谁能指导我如何使session id可供所有activities &#xff1f;这种情况的任何替代方法#1楼在活动之间传递…

面试时Android屏幕适配,Android—屏幕适配(面试技巧)

1.明白如下几个概念&#xff1a;屏幕尺寸&#xff0c;屏幕分辨率以及屏幕像素密度。<1>屏幕尺寸&#xff1a;指的是屏幕对角线的长度。以手机为例&#xff0c;常见的有4.2、5.0、5.5等。。<2>屏幕分辨率&#xff1a;指横纵向上的像素点数&#xff0c;单位是dpi&…

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

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

android cordova 教程,cordova入门教程(一)

一、创建cordova项目执行命令&#xff1a;//全局安装cordova命令行工具npm install -g cordova//创建项目cordova create hello com.example.hello HelloWorldcd hello//执行这步之前需要安装android studio android sdk 并且配置好相应的环境变量,最好是最新版&#xff0c;不…

html 适配iphonex,有关HTML5页面在iPhoneX适配问题

这次给大家带来有关HTML5页面在iPhoneX适配问题&#xff0c;有关HTML5页面在iPhoneX适配的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。1. iPhoneX的介绍屏幕尺寸倍图其实就是像素尺寸和开发尺寸的倍率关系&#xff0c;但这只是外在的表现。倍图核心…

html5 css3考试f卷,HTML5 CSS3 JavaScriptWeb前端开发自测试卷3.docx

自测试卷3一、选择题1&#xff0e;编写网页的过程中&#xff0c;下面那种注释不正确( )。A&#xff0e;B&#xff0e;//注释C&#xff0e;D&#xff0e;/*注释*/2&#xff0e;和标签说法不正确的是( )。A&#xff0e;标签是块级元素B&#xff0e;标签是内联元素C&#xff0e;都…

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;但是随着电脑保存的内容越来越多&…

html默认下面,阅读下面配置web默认页面index.html的代码 index.html 下面选项中,说法正确的是() (多选)...

【判断题】白酒的品尝三部曲为:观其色、闻其香和品其味。【单选题】以下不属于釉下彩的是【单选题】在流动性偏好理论框架中,利率是由下列哪项的需求和供给决定的?( )【单选题】假想投影画法中用()画出一个极限位置,用()画出其余位置的假想投影【单选题】看到了姜夔的诗以后,感…

北工大计算机网络基础期末考试,2013北工大计算机网络应用复习提纲整理版.doc...

复习提纲计算机网络发展的四个阶段及每个阶段的特征第一阶段&#xff1a;面向终端的计算机网络由于终端没有独立处理数据的能力&#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)每小…