- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在扫描蓝牙 LE 设备并作为外围设备运行(在第二代 Moto G 上运行 Android 6.0)
我遇到的问题是有时(看起来是随机的,但经常)它找不到我的任何其他外围设备,其他时候它工作正常。
我有一个配套的 iOS 设备运行类似的代码(既扫描外围设备又充当外围设备),当 Android 扫描找不到 iOS 设备时,我的 iOS 发现 Android 设备充当外围设备就好了。所以这似乎只是事物扫描方面的问题。
不仅找不到我的配套 iOS 设备,而且找不到任何蓝牙设备。当它工作时,它会找到我的配套 iOS 设备以及许多其他设备。
我已经尝试过使用和不使用 ScanFilters,但都遇到了同样的问题。我正在针对 SDK 26 进行构建,最低 SDK 为 23。
我正在设置所需的权限,因为它有时会起作用。
相关代码如下:
private void startScanning() {
mHandler = new Handler(mContext.getMainLooper());
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.setReportDelay(0)
.build();
mBluetoothLeScanner.startScan(null, settings, mScanCallback);
}
}, 1000);
}
private ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
if( result == null || result.getDevice() == null )
return;
Log.e("myTest", "Found Device");
BluetoothDevice device = result.getDevice();
final String deviceAddress = device.getAddress();
List<ParcelUuid> parcel = result.getScanRecord().getServiceUuids();
if (parcel != null) {
String parcelUUID = parcel.toString().substring(1,37);
if (parcelUUID.equalsIgnoreCase(mContext.getString(R.string.service_uuid))) {
final BluetoothDevice bleDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(deviceAddress);
if (!seenPeripherals.contains(deviceAddress)) {
stopScanning();
mHandler = new Handler(mContext.getMainLooper());
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Log.e("AppToApp", "Trying to connect to device " + deviceAddress);
mGatt = bleDevice.connectGatt(mContext, false, mGattCallback);
}
}, 1000);
}
}
}
}
}
最佳答案
我遇到了同样的问题。这是因为针对 Marshmallow API 23 和更高版本的 Google 政策已更改,要使用 BLE,用户需要打开 ON GPS。对于 Google 文档,请检查此 Permission @ Runtime关联。要修复它,您必须在手机设置中启用“位置”,并在运行时 在应用程序中请求位置权限。两者都需要完成才能使扫描正常工作。
要请求位置权限,请将以下内容放入对话框或类似内容中:
myActivity.requestPermissions(new String[]{Manifest.permission.ACCESS_COURSE_LOCATION}, yourPermissionRequestCode);
并实现:
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] Results){
if(requestCode == yourPermissionRequestCode)
{
... //Do something based on Results
}
}
在 myActivity
中处理用户选择的任何内容。您还需要执行以下操作以打开设备的定位服务:
Intent enableLocationIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
myActivity.startActivityForResult(enableLocationIntent, yourServiceRequestCode);
你可以检查用户是否开启定位服务,方法是:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(requestCode == yourServiceRequestCode)
{
...//Do whatever you need to
}
}
在 myActivity
中。您还可以通过执行以下操作手动打开定位服务:
进入手机设置 -> 选择“应用” -> 选择你的应用 -> 选择“权限”选项 -> 打开“位置”权限。
一旦用户启用了权限并启动了定位服务,您就可以开始扫描外围设备了。我注意到,如果您在启用允许/打开位置服务它仍然不会在你的 onScanResults
这允许公司查看您的位置并将您引导到他们想要的地方。
在扫描设备时,一旦连接到 BLE 设备,您就可以关闭手机上的定位服务,您仍将保持与外围设备的连接。但是,一旦连接到固件(外围设备),您就无法连接到任何新的外围设备,直到断开与配对设备的连接,并且所有其他扫描设备(移动设备)都无法在其扫描列表中看到外围设备名称(当用户通过外围设备搜索附近)当外围设备已经连接到任何其他移动设备时,因为外围设备一次只能连接到一个设备。对于 BLE 基本示例,您可以查看此 Truiton Ble tutorial .我认为此代码段将解决您的问题。快乐编码:)
关于android - Bluetooth LE 扫描有时找不到设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47041838/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!