segunda-feira, abril 28, 2014

Comunicação Bluetooth entre Arduino e Android - Software do Android, parte 1

Vamos começar a ver a programação no lado Android. O uso do Bluetooth é razoavelmente complexo, exigindo o cuidado com vários detalhes. Por este motivo, optei por dividir isto em três partes: a iniciação do Bluetooth, a descoberta dos dispositivos próximo e a conexão e comunicação propriamente ditas.

Antes de mais nada, para poder usar as funções de Bluetooth você deve colocar no manifesto que usará as permissões BLUETOOTH e BLUETOOTH_ADMIN:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

O ponto de partida para controle do Bluetooth é obter um objeto BluetoothAdapter:
private BluetoothAdapter mBluetoothAdapter;

//...

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
Se o objeto for null, o device Android não dispõe de interface Bluetooth. Nada pode ser feito neste caso, fora avisar ao usuário.

Se o objeto for null, temos uma interface Bluetooth, mas ela pode estar desligada. Neste caso, devimos pedir ao usuário para ligá-la. A forma correta de fazer é pedir ao sistema Android apresentar a solicitação e, se o usuário concordar, ligar o Bluetooth:
private static final int REQUEST_ENABLE_BT = 1;

if (mBluetoothAdapter != null) {
    if (!mBluetoothAdapter.isEnabled()) {
        // Pede para ligar o Bluetooth
        Intent enableBtIntent = new Intent(
                BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult (enableBtIntent, REQUEST_ENABLE_BT);
        return false;
    }
}
Reparar que estamos disparando uma nova Activity através de startActivityForResult.Desta forma, a nossa atividade será suspensa até que o usuário faça a opção de ligar o Bluetooth ou recusar a solicitação. Após a opção será chamado o método onActivityResult. O parâmetro requestCode conterá a identificação da Activity (REQUEST_ENABLE_BT no meu exemplo) e o parâmetro resultCode informará a opção do usuário:
public boolean onActivityResult(int requestCode, int resultCode) {
    if (requestCode == REQUEST_ENABLE_BT) {
        if (resultCode == Activity.RESULT_OK) {
            // Autorizado acesso ao Bluetooth
        } else if (resultCode == Activity.RESULT_CANCELED) {
            // Negado acesso ao Bluetooth
        }
        return true;
    }
    return false;
}

Uma dificuldade adicional é que o usuário pode ligar ou desligar o Bluetooth quando quiser. Para termos uma aplicação mais robusta é importante estarmos atentos para estas alterações. Isto é feito registrando um Receiver para esta ação:
// registra mReceiverBT para receber avisos da mudança de estado do BT
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(mReceiverBT, filter);

// trata notificaçoes de mudança de estado do BT
private final BroadcastReceiver mReceiverBT = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
            // estado mudou
            int estado = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);
            if ((estado == BluetoothAdapter.STATE_ON)) {
                // Ligou Bluetooth
            } else if (estado == BluetoothAdapter.STATE_OFF) {
                // Desligou Bluetooth"
            }
        }
    }
};

Somente após confirmarmos que temos uma interface Bluetooth e que ela está ligada podemos ir em frente, tipicamente procurando os dispositivos que estão no alcance - o que veremos na próxima parte.

Nenhum comentário: