Подтвердить что ты не робот

Отправка файла Bluetooth для Android

Я пытаюсь отправить файл через Bluetooth в Android-устройстве. Я сделал открытие, подключение и сделал разъем Bluetooth. Проблема в том, что когда я пишу массив байтов в выходном потоке сокета bluetooth, получающая сторона ничего не получает, хотя принимает, что что-то отправляется.

Вот что я делаю (плохой адаптер Bluetooth)

Просьба сообщить.

try
    {
        BluetoothDevice dev = bad.getRemoteDevice(a);
        bad.cancelDiscovery();

        dev.createRfcommSocketToServiceRecord(new UUID(1111, 2222));
        Method m = dev.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
        bs = (BluetoothSocket) m.invoke(dev, Integer.valueOf(1));
        bs.connect();
        tmpOut = bs.getOutputStream();
    }catch(Exception e)
    {

    }

    File f = new File(filename);

    byte b[] = new byte[(int) f.length()];
    try
    {
        FileInputStream fileInputStream = new FileInputStream(f);
        fileInputStream.read(b);
    }catch(IOException e)
    {
        Log.d(TAG, "Error converting file");
        Log.d(TAG, e.getMessage());
    }

    try {
        tmpOut.write(b);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
4b9b3361

Ответ 1

Я использую приведенный ниже код для подключения к последовательной службе на удаленном устройстве Bluetooth, и он отлично работает для меня. Просто убедитесь, что другое устройство (может быть мобильным или ПК) имеет гнездо сервера для последовательной связи через Bluetooth (см. Код на стороне сервера ниже)

Клиентская сторона:

UUID serialUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
BluetoothDevice btDevice = btAdapter.getRemoteDevice(BTAddress); // Get the BTAddress after scan
BluetoothSocket btSocket = btDevice.createRfcommSocketToServiceRecord(SERIAL_UUID);
btSocket.connect();
InputStream iStream = btSocket.getInputStream();
OutputStream oStream = btSocket.getOutputStream();

Сторона сервера:

UUID serialUUID = new UUID("1101", true);
String serviceURL = "btspp://localhost:" + serialUUID
        + ";name=Android BT Server;authorize=false;authenticate=false";
StreamConnectionNotifier connectionNotifier = (StreamConnectionNotifier) Connector
                        .open(serviceURL);
// Blocking method will wait for client to connect
StreamConnection connection = connectionNotifier.acceptAndOpen();

RemoteDevice remoteDevice = RemoteDevice.getRemoteDevice(connection);
InputStream btInput = connection.openInputStream();
OutputStream btOutput = connection.openOutputStream();

Ответ 2

Почему бы не использовать стандартный вызов api вместо вызова через отражение, например:

BluetoothSocket socket =  destination
                              .createRfcommSocketToServiceRecord(new UUID(...)) ;

Также ваш блок catch пуст. Вы уверены, что сокет был подключен без каких-либо исключений? Connect вызовет исключение IOException, если соединение по какой-либо причине не получилось. См. Ссылку

Ответ 3

Возможно, потому, что dev и bs выходят за пределы области видимости до того, как tmpout используется, потому что они объявлены в вашем блоке try/catch.