Отправка файла 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();
}
Ответы
Ответ 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.