Android-приложение Bluetooth не отвечает во время телефонного звонка - PullRequest
2 голосов
/ 01 февраля 2012

У меня есть приложение, которое связывается с устройством Bluetooth через асинхронную задачу если мне позвонят и во время разговора я вернусь в приложение экран тускнеет и приложение не отвечает кнопка назад не работает ... и диалог ANR не отображается есть идеи?

вот код, который обрабатывает соединение:

@Override
protected Object doInBackground(Object... params) {
    //boolean protocolUpdated;
    int read = 0;                                      // The amount of bytes read from the socket.
    byte[] buff = new byte[MessageHandler.BUFFERSIZE]; // The data buffer.
    byte[] tmpSend = null;                             // Misc bytes arrays returned from ProtocolParser as answers to send after decoding calls.
    in = null;
    out = null;

    try {
        if (Float.parseFloat(version) > 2.2){
            Method m = dev.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
            sock = (BluetoothSocket) m.invoke(dev, 1);
        }

        else sock = dev.createRfcommSocketToServiceRecord(UUID_RFCOMM_GENERIC); // UUID is constant for serial BT devices.
        sock.connect(); // connect to the BT device. This is rather heavy, may take 3 secs.
        sendMessage(MESSAGE_CONNECTION_ESTABLISHED);
        in = sock.getInputStream();
        out = sock.getOutputStream();

        timer = new Timer();
        startFinishTimer();         //initialize finish timer

        while(read != -1) {     // read = -1 means EOF.
            do {                // as long as there is anything to send in the send queue - send it.
                tmpSend = parser.nextSend();
                if(tmpSend != null){
                    String msg = parseMessage(tmpSend);
                    Log.d("Writing:",msg);
                    out.write(tmpSend);
                }
            } while(tmpSend != null);
            read = in.read(buff);       // read. This is a blocking call, to break this, interrupt the thread.
            timer.cancel();             
            startFinishTimer();         //read is a blocking call so timer should be restarted only after read bytes.
            parser.parse(buff,read);    // parse the read message using the logic in the ProtocolParser derived class.
            tmpSend = parser.getPool(); // if pool ack is required - send it.
            if (tmpSend != null){

                Log.d("Writing:",parseMessage(tmpSend));
                out.write(tmpSend);

            }
            if (read != 0){
                Log.d("Read:",parseMessage(buff));
                tmpSend = parser.getAnswer(); // if answer is required (based on message) - send it.
                if(tmpSend != null){
                    out.write(tmpSend);
                }
            }
            else {
                Exception e = new IOException();
                throw e;
            }
        }
    }catch (IOException e){
        e.printStackTrace();
        Log.d("Connection: ", "Bluetooth Connection CRASHED!");
        sendMessage(MESSAGE_CONNECTION_LOST);
    }catch (Exception e){
        e.printStackTrace();
    } 
    return null;
}

1 Ответ

0 голосов
/ 06 ноября 2013

На самом деле недостаточно контекста, чтобы найти вашу проблему.

Убедитесь, что вы запускаете эту задачу из основного потока, в противном случае PostExecute будет присоединен к неправильному потоку, вы можете получить гонку.

Убедитесь, что вы не отправляете одно и то же сообщение нескольким обработчикам в вашем коде.Сообщите, что это связанный список, и в этом случае вы можете получить ANR.

Получить /data/anr/traces.txt, чтобы убедиться, что это не ANR.

Вы можете убедиться по времени вначало файла.

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