连接到特定的HID配置文件蓝牙设备

时间:2014-10-13 13:54:35

标签: android bluetooth profile hid input-devices

我将蓝牙条码扫描器连接到我的Android平板电脑。条码扫描器与Android设备绑定作为输入设备 - HID配置文件。它在系统蓝牙管理器中显示为键盘或鼠标。我发现蓝牙配置文件输入设备类存在但是隐藏了。 class和btprofile常量在android文档中有@hide annotaions。

隐藏课程:

  

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3.1_r1/android/bluetooth/BluetoothInputDevice.java

这里它们也应该是3个其他常量

  

developer.android.com/reference/android/bluetooth/BluetoothProfile.html#HEADSET

就像

一样
public static final int INPUT_DEVICE = 4;
public static final int PAN = 5;
public static final int PBAP = 6;

通过反射可以轻松访问常量。 我需要实现的是隐藏配置文件(INPUT_DEVICE)的设备列表。使用方法进行小改动应该很简单:

  

developer.android.com/reference/android/bluetooth/BluetoothA2dp.html#getConnectedDevices()

不适用于A2dp配置文件,但也适用于通过反射方法访问的hid配置文件。 遗憾的是

Class c = Class.forName("android.bluetooth.BluetoothInputDevice")

不起作用.. 任何想法我应该如何处理这个问题?我只需要隐藏设备列表

1 个答案:

答案 0 :(得分:5)

我想出了如何解决我的问题。 That非常有帮助。 首先,我需要准备一个返回隐藏配置文件的input_device隐藏常量的反射方法:

public static int getInputDeviceHiddenConstant() {
    Class<BluetoothProfile> clazz = BluetoothProfile.class;
    for (Field f : clazz.getFields()) {
        int mod = f.getModifiers();
        if (Modifier.isStatic(mod) && Modifier.isPublic(mod) && Modifier.isFinal(mod)) {
            try {
                if (f.getName().equals("INPUT_DEVICE")) {
                    return f.getInt(null);
                }
            } catch (Exception e) {
                Log.e(LOG_TAG, e.toString(), e);
            }
        }
    }
    return -1;
}

而不是那个功能,我可以使用值4,但我想要优雅。

第二步是定义特定配置文件的监听器:

BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() {
        @Override
        public void onServiceConnected(int profile, BluetoothProfile proxy) {
            Log.i("btclass", profile + "");
            if (profile == ConnectToLastBluetoothBarcodeDeviceTask.getInputDeviceHiddenConstans()) {
                List<BluetoothDevice> connectedDevices = proxy.getConnectedDevices();
                if (connectedDevices.size() == 0) {
                } else if (connectedDevices.size() == 1) {
                    BluetoothDevice bluetoothDevice = connectedDevices.get(0);
                    ...
                } else {
                    Log.i("btclass", "too many input devices");
                }
            }

        }

        @Override
        public void onServiceDisconnected(int profile) {

        }
    };

我调用了第三步

mBluetoothAdapter.getProfileProxy(getActivity(), mProfileListener,
            ConnectToLastBluetoothBarcodeDeviceTask.getInputDeviceHiddenConstant());

一切都清楚有效,mProfileListener返回特定配置文件蓝牙设备列表/ -es。 最有趣的事情发生在onServiceConnected()方法中,它返回隐藏类BluetoothInputDevice的对象:)