Как определить EOF на андроид передачи файлов Bluetooth? - PullRequest
3 голосов
/ 24 апреля 2011

Я установил соединение Bluetooth, используя теперь классический код Google Bluetooth Chat. Однако у меня есть вопрос, который я просто не могу обернуть вокруг себя.

Чтение входного потока происходит примерно так:

public void run() {
    byte[] buffer = new byte[1024];  // buffer store for the stream
    int bytes; // bytes returned from read()

    // Keep listening to the InputStream until an exception occurs
    while (true) {
        try {
            // Read from the InputStream
            bytes = mmInStream.read(buffer);
            // Send the obtained bytes to the UI Activity
            mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
                    .sendToTarget();
        } catch (IOException e) {
            break;
        }
    }
}

Хорошо, если бы я просто распечатывал символы, которые получил, как в оригинальном примере. Однако предположим, что я хотел передать файл изображения. Я не знаю размер файла, поэтому я не могу сосчитать полученные байты или что-то в этом роде. В моих тестах я, кажется, никогда не получал «-1» из входного потока, что представляется «нормой» для чтения из входных потоков. Так как я могу узнать, что достиг конца отправляемого файла?

Спасибо за вашу помощь и ваше время.

Ответы [ 4 ]

3 голосов
/ 24 апреля 2011

Кажется, что входные потоки Bluetooth для Android никогда не возвращают -1.

Я полагаю, установить простой протокол, отправив в первую очередь размер файла, и, наконец, помогут сигналы EOF.

2 голосов
/ 09 октября 2011

Нет, это не так.Андроид отправляет -1 только когда сокет закрыт насколько я знаю.Таким образом, обходной путь может заключаться в том, чтобы сделать переподключение, но я пытался это часами и не получалось, так как я не понимаю этот «специальный» код здесь (скопированный из потока Stackoverflow) для настройки сокета:*

        BluetoothSocket tmp = null;
    Log.d(TAG, "New Connection initialized");
    Method m;
    try {
        m = device.getClass().getMethod("createRfcommSocket",
                new Class[] { int.class });
        tmp = (BluetoothSocket) m.invoke(device, 1);
    } catch (Exception e) {
        e.printStackTrace();
    }
    mmSocket = tmp;

Этот сокет работает только тогда, когда мое приложение запускается для первой передачи файла.Если я захочу «переподключиться» с совершенно новым экземпляром объекта (и новым сокетом, созданным с помощью этого кода), программа зависнет при блокировании методом mmSocket.connect ().Кажется, что метод никогда не заканчивается.Это сводит меня с ума ...

1 голос
/ 21 декабря 2015

Попробуйте это:

        public void run() {
        byte[] buffer;
        ArrayList<Integer> arr_byte = new ArrayList<Integer>();
        while (true) {
            try {
                int data = mmInStream.read();
                if(mmInStream.available()>0) {
                    arr_byte.add(data);
                } else {
                    arr_byte.add(data);
                    buffer = new byte[arr_byte.size()];
                    for(int i = 0 ; i < arr_byte.size() ; i++) {
                        buffer[i] = arr_byte.get(i).byteValue();
                    }
                    Log.e("INPUT",new String(buffer));
                    mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
                            .sendToTarget();
                    arr_byte = new ArrayList<Integer>();
                }
            } catch (IOException e) {
                break;
            }
        }
    }
1 голос
/ 24 апреля 2011

Попробуйте

while ((bytes = mmInStream.read(buffer) != -1)

и посмотрите, поможет ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...