- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有时,BluetoothDevice.getName() 返回 null。我该如何解决?remoteDeviceName 在以下代码中可能为 null。我需要通过 remoteDeviceName 区分我的设备和其他设备。
BluetoothAdapter.getDefaultAdapter().startLeScan(new LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, final int rssi,
byte[] scanRecord) {
String remoteDeviceName = device.getName();
Log.d("Scanning", "scan device " + remoteDeviceName);
});
最佳答案
最后,我找到了解决方案:
1.对于连接的设备:
从gatt特性中读取设备名称org.bluetooth.characteristic.gap.device_name服务org.bluetooth.service.generic_access .
2.对于未连接的设备:
/**
* Get device name from ble advertised data
*/
private LeScanCallback mScanCb = new LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, final int rssi,
byte[] scanRecord) {
final BleAdvertisedData badata = BleUtil.parseAdertisedData(scanRecord);
String deviceName = device.getName();
if( deviceName == null ){
deviceName = badata.getName();
}
}
////////////////////// Helper Classes: BleUtil and BleAdvertisedData ///////////////
final public class BleUtil {
private final static String TAG=BleUtil.class.getSimpleName();
public static BleAdvertisedData parseAdertisedData(byte[] advertisedData) {
List<UUID> uuids = new ArrayList<UUID>();
String name = null;
if( advertisedData == null ){
return new BleAdvertisedData(uuids, name);
}
ByteBuffer buffer = ByteBuffer.wrap(advertisedData).order(ByteOrder.LITTLE_ENDIAN);
while (buffer.remaining() > 2) {
byte length = buffer.get();
if (length == 0) break;
byte type = buffer.get();
switch (type) {
case 0x02: // Partial list of 16-bit UUIDs
case 0x03: // Complete list of 16-bit UUIDs
while (length >= 2) {
uuids.add(UUID.fromString(String.format(
"%08x-0000-1000-8000-00805f9b34fb", buffer.getShort())));
length -= 2;
}
break;
case 0x06: // Partial list of 128-bit UUIDs
case 0x07: // Complete list of 128-bit UUIDs
while (length >= 16) {
long lsb = buffer.getLong();
long msb = buffer.getLong();
uuids.add(new UUID(msb, lsb));
length -= 16;
}
break;
case 0x09:
byte[] nameBytes = new byte[length-1];
buffer.get(nameBytes);
try {
name = new String(nameBytes, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
break;
default:
buffer.position(buffer.position() + length - 1);
break;
}
}
return new BleAdvertisedData(uuids, name);
}
}
public class BleAdvertisedData {
private List<UUID> mUuids;
private String mName;
public BleAdvertisedData(List<UUID> uuids, String name){
mUuids = uuids;
mName = name;
}
public List<UUID> getUuids(){
return mUuids;
}
public String getName(){
return mName;
}
}
关于android BluetoothDevice.getName() 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26290640/
这是我的程序的两个部分 1. Set pairedDevices; BluetoothDevice[] pairedDevicesArray; 2. pairedDevices = btAdapter
我是一名 iOS 开发人员,正在构建我的第一个 Android 蓝牙应用程序。在我的应用程序中,我有两个类,一个调用第二个类的主类是我的 BluetoothGattCallback。 扫描设备后,我找
我有一个项目,两者都有 在其中我使用(简化)调用扫描 BT 设备: final BluetoothLeScanner scanner = BluetoothAdapter.getDefaultAd
这个问题在这里已经有了答案: Android 6.0 - Bluetooth - No code exists for Action_Found broadcast intent (1 个回答) 关
在我使用蓝牙的应用程序中,日志中可能充斥着数百行“D/BluetoothDevice: mAddress: (address)”行。假设我可以忽略它们,我该如何过滤掉这些行? 最佳答案 显然,这已在
在 Android 中,您可以为配对设备指定一个不同于设备本身的广告名称的名称。但是,如果我在 BluetoothDevice 上调用 getName(),我会得到设备自己的名称。 有没有办法获取设备
我想保存我的应用程序连接到的最后一个蓝牙设备。如果以前有蓝牙连接,我根本不想提示用户。他们可以选择连接到新设备,但他们不需要这样做。如果他们选择不选择连接,他们会定期使用该应用程序,然后在需要蓝牙设备
我刚开始使用 Android,并使用低功耗蓝牙在 Android Studio 中设置了一个 API 21 项目。 深入研究 BluetoothDevice 向我展示了 ConnectGatt() 方
我正在使用此 sample-code 对 Android 的蓝牙 LE 功能进行一些简单的扫描 + 广告测试 我正在使用三星 6 和 Nexus 9 对其进行测试,出于某种原因,如果我让应用程序在三星
使用 Log 类跟踪运行时显示 onReceive() 方法没有调用,为什么? 动态注册广播接收器 private void discoverDevices () { Log.e("MOHA
这里是 Kotlin 菜鸟。 当我在 BluetoothDevice 上 ctrl+click 时,它会打开... \AppData\Local\Android\Sdk\sources\android
我的应用程序在连接到某些设备上的 BluetoothGatt 时出现问题。 所有 BLE 相关代码都驻留在 android Service 中,除 Huawei CAM-L03 外一切正常。据报道,一
我发现崩溃实例大幅增加,几个不同的崩溃报告都以相同的致命异常结束: [BluetoothDevice classicDevice]:无法识别的选择器发送到实例 0x2805a8ba0 这种情况在 iO
我有一个 BluetoothDevice 及其关联的 BluetoothGatt 对象。这是用户每天连接的设备,它没有任何经常变化的特性或服务。 现在为了与设备交互,每次连接后我必须首先发现所有服务,
这是我的扫描仪回调代码。 private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeSc
我的应用程序与 BLE 外围设备通信。有时,应用程序会在已连接外围设备的情况下启动。我可以通过调用以下方式取回设备: BluetoothManager manager = (BluetoothMana
我的 Android 手机允许我重命名已配对的设备,方法是转至 [设置 > 无线和网络 > 蓝牙] Activity 页面并单击已配对蓝牙设备右侧的设置按钮。但是,当我使用 BluetoothAdap
我正在尝试通过我的应用程序管理多个蓝牙事件,这样用户就不需要离开应用程序并尝试从 Android 设置中搜索/配对蓝牙设备。 我能够枚举以前配对的设备并开始发现,但是我找不到附近的设备。 背景信息:
有时,BluetoothDevice.getName() 返回 null。我该如何解决?remoteDeviceName 在以下代码中可能为 null。我需要通过 remoteDeviceName 区
我想知道远程物理设备中的哪些事件会触发监听设备中的 ACTION_ACL_CONNECTED 和 ACTION_ACL_DISCONNECTED。我的测试结果毫无意义。我收集了几个彼此相距几分米的设备
我是一名优秀的程序员,十分优秀!