我尝试在我的Android应用程序(运行4.1.2的三星手机:客户端)和我的笔记本电脑(Win7,64位:服务器)之间建立蓝牙连接.服务发现失败时始终失败.
我阅读了关于这个(这里和那里)的各种主题,但它没有解决我的问题.
我有两个问题:
备注:
我有这些权限
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
Run Code Online (Sandbox Code Playgroud)
编辑
我没有在客户端编码UUID,而是尝试了以下方法(但仍然得到相同的错误):
UUID uuid = bluetoothDevice.getUuids()[bluetoothDevice.getUuids().length-1].getUuid();
Run Code Online (Sandbox Code Playgroud)
echo-server的UUID始终是数组中的最后一个.
结束编辑
以下是客户端上的相关日志:
08-22 12:30:28.627: ERROR/BluetoothService.cpp(12008): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session)
08-22 12:30:28.647: INFO/BluetoothSocket.cpp(18030): Setting Master socket option
08-22 12:30:28.647: VERBOSE/BluetoothSocket.cpp(18030): ...fd 43 created (RFCOMM, lm = 7)
08-22 12:30:28.687: DEBUG/BluetoothPolicyService(12008): getAllowBluetoothDataTransfer - showMsg: true
08-22 12:30:28.687: DEBUG/BluetoothPolicyService(12008): MDM: isProfileEnabled = true
08-22 …
Run Code Online (Sandbox Code Playgroud) 这就是我想要实现的目标.我有2个Android设备,我想通过蓝牙访问第二个摄像头,并在第一个显示预览.
任何提示如何做到这一点?
基本上我想通过蓝牙获得另一个Android设备的相机实例.
在我的应用程序中,我发现了蓝牙设备,因此得到以下---
这是通过BluetoothDevice
为每个发现的设备获取对象并调用
object.getName()
和来完成的object.getAddress()
.
我还想获得每个发现的蓝牙设备的序列号.
我知道要把我自己设备的序列号作为---
android.os.Build.SERIAL
Run Code Online (Sandbox Code Playgroud) 我是android ndk的新手.那么,是否可以在非root设备上使用android NDK(与SDK或类似相同)使用蓝牙.如果可能的话,请指导我在哪里可以找到更多相关信息.非常感谢.
我有连接到的代码,然后尝试发现自定义BLE服务器设备广告自定义服务提供的所有服务.
代码可以使用
代码不工作的
在发生故障的设备上,它经常发现在一个(两个)广告相同BLE服务的设备上的所有BLE服务.重新启动Android设备和/或摆弄wifi/bt使其发现其他BLE设备上的所有服务但不是第一个(!).
有人知道三星设备有关BLE服务发现的突出问题吗?
有所有服务:
04-16 13:28:00.999: V/ScanningState(9741): onServicesDiscovered()
04-16 13:28:00.999: I/ScanningState(9741): The device has service 00001800-0000-1000-8000-00805f9b34fb
04-16 13:28:00.999: I/ScanningState(9741): The device has service 0000180a-0000-1000-8000-00805f9b34fb
04-16 13:28:00.999: I/ScanningState(9741): The device has service 0000180f-0000-1000-8000-00805f9b34fb
04-16 13:28:00.999: I/ScanningState(9741): The device has service f0ba0000-c6b5-11e2-8b8b-0800200c9a66
04-16 13:28:00.999: I/ScanningState(9741): The device has service f0ba0100-c6b5-11e2-8b8b-0800200c9a66
04-16 13:28:00.999: I/ScanningState(9741): The device has service f0ba1100-c6b5-11e2-8b8b-0800200c9a66
Run Code Online (Sandbox Code Playgroud)
缺少服务:
04-16 14:05:31.179: V/ScanningState(10710): onServicesDiscovered() …
Run Code Online (Sandbox Code Playgroud) Android中定义了两种方法来查找蓝牙设备.1.使用bluetoothAdapter.startScan 2. bluetoothAdapter.discover
哪种方法更好.
第二个问题,在onLeScan回调中,如何检查扫描是否已停止.
我已经在GitHub上为这个问题准备了一个简单的测试项目。
我正在尝试创建一个Android应用,该应用将从计算机屏幕扫描QR码,然后使用数据(MAC地址和PIN或哈希)与蓝牙设备轻松配对(绑定)。
与流行的InstaWifi应用类似-但适用于经典蓝牙。
出于测试目的,我尚未执行任何条形码扫描,而仅显示设备列表:
用户触摸其中一台设备后,将在MainActivity.java中尝试配对:
private void startBluetoothPairing(BluetoothDevice device) {
Intent pairingIntent = new Intent(BluetoothDevice.ACTION_PAIRING_REQUEST);
pairingIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
BluetoothDevice.PAIRING_VARIANT_PIN);
pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_KEY, 1234);
//device.setPin(new byte[]{1,2,3,4}); <- DOES NOT CHANGE ANYTHING
//device.setPairingConfirmation(false);
startActivityForResult(pairingIntent, REQUEST_BT_SETTINGS);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,弹出窗口仍然要求输入PIN:
因为我实际上已经在源代码中指定了PIN,所以我实际上希望显示另一个更简单的系统对话框(在进行NFC OOB配对时会显示该对话框):
通过搜索解决方案,我知道有一个setPin()方法,但是它在这里不适用(或者是?)-因为我正在尝试将整个智能手机与蓝牙设备配对,而不仅是与应用程序配对...
我的问题:如何使Android OS显示简单的“取消/配对”对话框?
在GitHub上搜索蓝牙配对请求字符串未显示任何提示...
更新:根据unrealsoul007的建议(感谢),我已经在MainActivity.java中更新了源代码,现在显示了简单的“取消/配对”对话框:
private void startBluetoothPairing(BluetoothDevice device) {
Intent pairingIntent = new Intent(BluetoothDevice.ACTION_PAIRING_REQUEST);
pairingIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION);
pairingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(pairingIntent, REQUEST_BT_PAIRING);
}
Run Code Online (Sandbox Code Playgroud)
但是我不确定如何完成配对过程-因为甚至在关闭对话框之前onActivityResult
都会调用resultCode=0
:
@Override …
Run Code Online (Sandbox Code Playgroud) android bluetooth android-intent android-bluetooth bluetooth-oob
我正在构建一个针对5.0+的Android应用,它使用BLE连接到多个外围设备.这些外围设备中的每一个都具有许多(~10)特性.理想情况下,我想订阅这些特征中每一个特征的变化通知.
但是,我从阅读中理解的是,Android的蓝牙实施对可以激活的同时通知的数量实施了硬性限制.此问题确定了在Android蓝牙实施中定义限制的位置,并且还记录了限制随时间的变化:
最大并发活动通知(
BTA_GATTC_NOTIF_REG_MAX
):
- Android 4.3上的4
- Android 4.4上的7
- Android 5.0+上的15
Dave Smith在此视频中确认了这些数字,并建议:
在5.0+设备上进行测试,但是,我发现,我似乎能够成功订阅更超过15个通知.到目前为止,我已经观察到:
这些通知订阅通过两项措施取得成功:
GATT_SUCCESS
;这是好消息.一方面,更多"真实"通知==>减少手动轮询==>更好的用户体验.另一方面,无法创建导致"真实"通知设置失败的条件意味着我无法轻松编写或测试手动回退代码,一旦将此应用程序发布给真实用户,肯定会(?)需要这些代码.
我想启用Bluetooth HCI Snoop日志记录,但是,当我在Developer Settings中启用该选项时,我的内部存储目录中不会显示任何文件.我也查看了该/etc/bluetooth/bt_stack.conf
文件,并且没有表示BtSnoop已启用的行或存储Bt Snoop日志文件的位置.我也试过手动启用日志记录,adb shell settings put secure bluetooth_hci_log 1
但也没有解决问题.我在Pixel 2上运行Android 8.1.任何实际启用日志记录或任何解决方法的方法?