从适配器

时间:2015-07-03 12:42:08

标签: android android-bluetooth

我正在创建一个需要与蓝牙设备连接并从中获取数据的应用程序...该设备已设置为主设备,因此我需要实现Thread,其中listenUsingRfcommWithServiceRecord并等待它的连接:

    public AcceptThread(Context context, String serverName, UUID myUUID) {
    this.context = context;
    BluetoothServerSocket tmp = null;

    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    try {

        // MY_UUID is the app's UUID string, also used by the client code
        tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(serverName, myUUID);
    } catch (IOException e) { }
    mmServerSocket = tmp;
}

然后在run上运行代码socket = mmServerSocket.accept(5000),等待它开始与设备配对:

    public void run() {
    BluetoothSocket socket = null;
    while (true) {
        try {
            socket = mmServerSocket.accept(5000);
        } catch (IOException e) {
            Log.e(TAG,"IOException: " + e);
        }

        // If a connection was accepted
        if (socket != null) {

            // Manage the connection
            ManageConnectedSocket manageConnectedSocket = new ManageConnectedSocket(socket);
            manageConnectedSocket.run();

            try {
                mmServerSocket.close();
            } catch (IOException e) {
                Log.e(TAG, "IOException: " + e);
            }
            break;
        }
    }
}

设备要求输入验证密码,我需要有一个自动程序......为此,我实现了广播接收器,以了解设备何时被要求与其他设备相提并论:

IntentFilter filter = new IntentFilter(ACTION_PAIRING_REQUEST);
context.registerReceiver(mPairReceiver, filter);

并收到它:

private final BroadcastReceiver mPairReceiver = new BroadcastReceiver() {

    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_PAIRING_REQUEST.equals(action)) {
            Log.e(TAG,"ACTION_PAIRING_REQUEST");
            setBluetoothPairingPin(device);
        }
    }
};

在我的setBluetoothPairingPin方法中,我收到了一个BluetoothDevice对象:

public void setBluetoothPairingPin(BluetoothDevice device) {
    byte[] pinBytes = convertPinToBytes("0000");
    try {
        Log.e(TAG, "Try to set the PIN");
        Method m = device.getClass().getMethod("setPin", byte[].class);
        m.invoke(device, pinBytes);
        Log.e(TAG, "Success to add the PIN.");
        try {
            device.getClass().getMethod("setPairingConfirmation", boolean.class).invoke(device, false);
            Log.e(TAG, "Success to setPairingConfirmation.");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            Log.e(TAG, e.getMessage());
            e.printStackTrace();
        }
    } catch (Exception e) {
        Log.e(TAG, e.getMessage());
        e.printStackTrace();
    }

}

问题是我无法知道我的套接字何时收到信息,并且在连接之前连续无法知道我的BluetoothDevice设置配对Pin是什么... 有人可以帮助我超越这个吗?或者,当我从BluetoothServerSocket收听时,还有其他方法可以进行引脚验证吗?

如果我没有正确解释,请告诉我......

提前致谢

1 个答案:

答案 0 :(得分:0)

thisthis的帮助下,我能够为我工作......

我对方法setBluetoothPairingPin感到困惑,我无法理解当设备开始配对时实际调用了ACTION_PAIRING_REQUEST,这就是从用户...所以调用BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);,并改变设置配对方法的一点,我设法让它工作......

这是我的最终代码:

public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
    if (ACTION_PAIRING_REQUEST.equals(action)) {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                String PIN = "0000";

                byte[] pin = new byte[0];
                try {
                    pin = (byte[]) BluetoothDevice.class.getMethod("convertPinToBytes", String.class).invoke(BluetoothDevice.class, PIN);
                    BluetoothDevice.class.getMethod("setPin", byte[].class).invoke(device, pin);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                }
    }
}