Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查配对的蓝牙设备是打印机还是扫描仪(Android)_Java_Android_Bluetooth - Fatal编程技术网

Java 如何检查配对的蓝牙设备是打印机还是扫描仪(Android)

Java 如何检查配对的蓝牙设备是打印机还是扫描仪(Android),java,android,bluetooth,Java,Android,Bluetooth,我希望你能帮助我, 我正在开发一个Android应用程序,需要连接蓝牙设备,如扫描仪和打印机,目前我可以列出所有配对设备,但我想知道配对设备是否是打印机、扫描仪、手机等 有办法知道配对的蓝牙设备的类型吗?简而言之 是的,你可以。你 可以通过使用设备的。如果您知道某个设备的UUID,您可以根据报告的UUID将它们匹配起来,并知道哪个配对设备是什么 大概是这样的: BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); Me

我希望你能帮助我, 我正在开发一个Android应用程序,需要连接蓝牙设备,如扫描仪和打印机,目前我可以列出所有配对设备,但我想知道配对设备是否是打印机、扫描仪、手机等

有办法知道配对的蓝牙设备的类型吗?

简而言之

是的,你可以。你 可以通过使用设备的。如果您知道某个设备的UUID,您可以根据报告的UUID将它们匹配起来,并知道哪个配对设备是什么

大概是这样的:

BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();

Method getUuidsMethod = BluetoothAdapter.class.getDeclaredMethod("getUuids", null);

ParcelUuid[] uuids = (ParcelUuid[]) getUuidsMethod.invoke(adapter, null);
现在,只需将检索到的UUID与已知的UUID设备(在线或机箱上)进行比较

如果他们是匹配的,你知道那是什么设备

注意:最常见的UUID(扫描仪、打印机、鼠标)具有通用UUID
0001101-0000-1000-8000-00805F9B34FB


阅读有关方法、方法、java类的内容,最后我有一个想法,它可能会对您有所帮助

for (BluetoothDevice device : pairedDevices)
{
    String deviceBTMajorClass = getBTMajorDeviceClass(device.getBluetoothClass().getMajorDeviceClass());
    if (D) Log.d(TAG, "deviceBTMajorClass"+deviceBTMajorClass);
    //btArrayAdapter.add(deviceBTName + "\n"+ deviceBTMajorClass);
    data.add(device.getName() + "\n" + device.getAddress());
}

private String getBTMajorDeviceClass(int major) {
    switch (major) {
        case BluetoothClass.Device.Major.AUDIO_VIDEO:
            return "AUDIO_VIDEO";
        case BluetoothClass.Device.Major.COMPUTER:
            return "COMPUTER";
        case BluetoothClass.Device.Major.HEALTH:
            return "HEALTH";
        case BluetoothClass.Device.Major.IMAGING:
            return "IMAGING";
        case BluetoothClass.Device.Major.MISC:
            return "MISC";
        case BluetoothClass.Device.Major.NETWORKING:
            return "NETWORKING";
        case BluetoothClass.Device.Major.PERIPHERAL:
            return "PERIPHERAL";
        case BluetoothClass.Device.Major.PHONE:
            return "PHONE";
        case BluetoothClass.Device.Major.TOY:
            return "TOY";
        case BluetoothClass.Device.Major.UNCATEGORIZED:
            return "UNCATEGORIZED";
        case BluetoothClass.Device.Major.WEARABLE:
            return "AUDIO_VIDEO";`enter code here`
        default:
            return "unknown!";
    }
}

公认的答案过于笼统,因为UUID 0001101-0000-1000-8000-00805F9B34FB断言设备具有串行端口功能,而许多非打印机设备具有此类UUID

您应该评估完整CoD,此时您可以提取您需要识别的服务的精确位掩码,打印机的位掩码为:

0B0000001010000000

使用此功能,您可以在完整设备上进行屏蔽,如下所示:

专用静态打印机(蓝牙设备){
int printerMask=0B000000100000010100000000;
int fullCod=device.getBluetoothClass().hashCode();
日志d(标签“完整COD:+fullCod”);
Log.d(标记“掩码结果”+(fullCod和printerMask));
返回(完整代码和打印任务)=打印任务;
}

谢谢,我找到了另一种方法,但它会很有用。因为我只想过滤打印机配对的设备,我使用设备的Bluetooth类,所以我过滤getMajorDeviceClass(),所有设备都是1536(图像)和1280(外围设备),所以它解决了我的问题,但谢谢你的回答,也许以后会帮我的,明白了。它没有那么特定于应用程序。UUID永远不会改变。它是特定于硬件的,这就是为什么它是一个通用标识符。另外,更改它会带来安全风险,因此会违反蓝牙协议。@MaxPinto那么解决方案是什么?