A procura de dispositivos é iniciada pelo método startDiscovery() do objeto BluetoothAdapter. Este método retorna imediatamente, a procura em si roda em background. O nosso programa é informado do andamento da busca através de notificações:
- BluetoothDevice.ACTION_FOUND informa que um device foi encontrado. Os dados do device são fornecidos através de um objeto BluetoothDevice.
- BluetoothAdapter.ACTION_DISCOVERY_FINISHED informa que a procura foi encerrada. A procura encerra-se automaticamente após cerca de doze segundos.
Podemos usar várias estratégias para escolher com qual dispositivo iremos no comunicar. Uma opção é ir montando um lista à medida que os dispositivos são encontrados e apresentá-la para o usuário fazer a escolha. Outra opção é usarmos o nome. Uma terceira é usarmos o endereço MAC.
O processo de procura consome bateria e processamento e portanto não deve ser mantido em execução desnecessariamente. Se estamos usando um método automático para escolha do dispositivo, é interessante interromper a procura, através do método cancelDiscovery() assim que a procura encontrá-lo. Normalmente todos os dispositivos são encontrados bem antes dos doze segundos.
Se você quer se conectar a um dispositivo fixo, e conhece o MAC dele, você pode pular a etapa de busca e criar diretamente um objeto BluetoothDevice através do método getRemoteDevice (address) do objeto BluetoothAdapter. O parâmetro address é um String no formato "00:11:22:33:AA:BB", com as letras em maiúscula.
Vejamos um exemplo simples de tudo isto. O programa (que você encontra nos arquivos do blog em BTDiscovery.zip) apresenta um botão para disparar a procura e uma lista para mostrar os dispositivos encontrados. Eis o código:
public class MainActivity extends ListActivity {
private static final int REQUEST_ENABLE_BT = 1;
private Button btnDiscovery;
private ArrayAdapter<String> mAdapter;
private List<String> lstDispId;
private List<BluetoothDevice> lstDisp;
private Boolean procurando = false;
private BluetoothAdapter mBtAdapter;
// Criação da atividade
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Inicia a tela
setContentView(R.layout.activity_main);
btnDiscovery = (Button) findViewById(R.id.btnDiscovery);
btnDiscovery.setEnabled(false);
btnDiscovery.setOnClickListener(disparaDiscovery);
lstDispId = new ArrayList<String>();
lstDisp = new ArrayList<BluetoothDevice>();
mAdapter = new ArrayAdapter<String> (this, R.layout.item,
R.id.txtDisp, lstDispId);
setListAdapter(mAdapter);
// Pegar as notificações
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(mReceiverBT, filter);
// Inicia Bluetooth
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBtAdapter == null) {
Toast.makeText(this, R.string.semBT, Toast.LENGTH_LONG).show();
} else if (mBtAdapter.isEnabled()) {
btnDiscovery.setEnabled(true);
} else {
// Pede para ligar o Bluetooth
Intent enableBtIntent = new Intent(
BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult (enableBtIntent, REQUEST_ENABLE_BT);
}
}
// Encerramento da atividade
@Override
public void onDestroy() {
super.onDestroy();
if (procurando) {
mBtAdapter.cancelDiscovery();
}
}
// Trata retorno do pedido de ativação do Bluetooth
public boolean onActivityResult(int requestCode, int resultCode) {
if (requestCode == REQUEST_ENABLE_BT) {
if (resultCode == Activity.RESULT_OK) {
// Autorizado acesso ao Bluetooth
btnDiscovery.setEnabled(true);
} else if (resultCode == Activity.RESULT_CANCELED) {
// Negado acesso ao Bluetooth
}
return true;
}
return false;
}
// Trata botão Procura
private final OnClickListener disparaDiscovery = new OnClickListener() {
@Override
public void onClick(View v) {
lstDispId.clear();
lstDisp.clear();
mAdapter.notifyDataSetChanged();
if (mBtAdapter.startDiscovery()) {
btnDiscovery.setEnabled(false);
procurando = true;
} else {
Toast.makeText(MainActivity.this, R.string.erroDiscovery,
Toast.LENGTH_LONG).show();
}
}
};
// Trata notificações
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
btnDiscovery.setEnabled(true);
} else if (estado == BluetoothAdapter.STATE_OFF) {
// Desligou Bluetooth
btnDiscovery.setEnabled(false);
if (procurando) {
mBtAdapter.cancelDiscovery();
procurando = false;
}
}
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
// Encerrou procura
procurando = false;
mAdapter.notifyDataSetChanged();
btnDiscovery.setEnabled(true);
} else if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// Achou um device
BluetoothDevice device = intent.getParcelableExtra(
BluetoothDevice.EXTRA_DEVICE);
String ident;
if (device.getName() == null) {
ident = "?";
} else {
ident = device.getName();
}
ident += " (" + device.getAddress() + ")";
lstDispId.add(ident);
lstDisp.add(device);
}
}
};
}
Nenhum comentário:
Postar um comentário