Tutorial Android – Desenvolvendo com Bluetooth para comunicação veicular – Parte 1

On 2 de abril de 2014 by Fabio Oliveira de Paula

blue-tooth

Definições

Este tutorial descreve como usar as APIs do Bluetooth do Android para realizar as quatro grandes tarefas necessárias para se comunicar usando Bluetooth: a configuração do Bluetooth, encontrar dispositivos, conexão de dispositivos e transferência de dados entre dispositivos. A aplicação neste caso integra com o sistema OBDII em veiculos, mas serve para qualquer aplicativo que faça comunicação Bluetooth.

Todas as APIs Bluetooth estão disponíveis no pacote android.bluetooth. Aqui está um resumo das classes e interfaces que você precisa para criar conexões Bluetooth:

BluetoothAdapter
Representa o adaptador Bluetooth local (módulo Bluetooth). O BluetoothAdapter é  o ponto de entrada para toda a interação Bluetooth. Usando ele, você pode descobrir outros dispositivos Bluetooth, consultar uma lista de dispositivos pareados, instanciar um BluetoothDevice usando um endereço MAC conhecido, e criar um BluetoothServerSocket para obter comunicações com outros dispositivos.

BluetoothDevice
Representa um dispositivo Bluetooth remoto. Use-o para solicitar uma conexão com um dispositivo remoto através de um BluetoothSocket ou consultar informações sobre o dispositivo, como seu nome, endereço, classe e estado.

BluetoothSocket
Representa a interface para uma socket Bluetooth (semelhante a um socket TCP). Este é o ponto de conexão que permite a um aplicativo trocar dados com outro dispositivo Bluetooth via InputStream e OutputStream.

BluetoothServerSocket
Representa um servidor socket aberto que obtém as solicitações de entrada (semelhante a uma rede TCP ServerSocket). Para conectar dois dispositivos Android, um dispositivo deve abrir um servidor socket com esta classe. Quando um dispositivo Bluetooth remoto faz uma solicitação de conexão para este dispositivo, o BluetoothServerSocket retornará um sinal de conectado pelo BluetoothSocket quando essa conexão for aceita.

BluetoothClass
Descreve as características gerais e capacidades de um dispositivo Bluetooth. Este é um conjunto de propriedades que definem as classes do dispositivo e seus serviços. No entanto, não é confiável que descreva todos os perfis Bluetooth e serviços suportados pelo dispositivo, mas é útil como uma dica para o tipo de dispositivo.

BluetoothProfile
Uma interface que representa um perfil Bluetooth. Um perfil Bluetooth é uma especificação de interface sem fio para Bluetooth baseado em comunicação entre dispositivos. Um exemplo é o perfil Hands-Free. Para mais discussão sobre perfis, consulte Trabalhando com Perfis.

BluetoothHeadset
Fornece suporte para fones de ouvido Bluetooth para ser usado com telefones celulares. Isso inclui perfis Headset Bluetooth e Hands-Frees (v1.5).

BluetoothA2dp
Define como o áudio de alta qualidade pode ser transmitido de um dispositivo para outro através de uma conexão Bluetooth. “A2DP” significa Advanced Audio Distribution Profile.

BluetoothHealth
Representa um Health Device Profile proxy que controla o serviço de Bluetooth.

BluetoothHealthCallback
Uma classe abstrata que você usa para implementar o retorno de BluetoothHealth. Você deve estender essa classe e implementar os métodos de retorno para receber atualizações sobre as alterações no estado do aplicativo.

BluetoothHealthAppConfiguration
Representa uma configuração do aplicativo que o Bluetooth Health de terceiros registra para se comunicar com um dispositivo remoto Bluetooth Health.

BluetoothProfile.ServiceListener
Uma interface que notifica cliente IPC do BluetoothProfile quando tiverem sido ligado ou desligado do serviço (isto é, o serviço interno que é executado um perfil particular).

Primeiro aplicativo

O primeiro aplicativo de utilização do Bluetooth apresenta as etapas de configuração e consulta os dispositivos pareados.

Para isso, iremos criar 2 activities e 2 layouts XML. Crie um novo Projeto, conforme as instruções abaixo:

Instruções para criar novo projeto:

  1. Project Name e Application Name: à sua escolha;
  2. Package Name: comunicacao.bluetooth;
  3. Create Activity: AppBT1;
  4. Após criado o projeto, crie outra Activity com o nome DeviceListActivity.
  5. Crie um layout (além do main.xml), com o nome paired_devices.xml;
  6. Copie os códigos abaixo para as activities e layouts criados. Copie também o Arquivo Manifest que está abaixo.

AppBT1.java

[sourcecode language=”java”]
package comunicacao.bluetooth;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class AppBT1 extends Activity {
private static final int REQUEST_ENABLE_BT = 1;
private static final int REQUEST_PAIRED_DEVICE = 2;
/** Called when the activity is first created. */

Button btnListPairedDevices;
TextView stateBluetooth;
BluetoothAdapter bluetoothAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnListPairedDevices = (Button)findViewById(R.id.listpaireddevices);
stateBluetooth = (TextView)findViewById(R.id.bluetoothstate);
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

CheckBluetoothState();
btnListPairedDevices.setOnClickListener(btnListPairedDevicesOnClickListener);
}

private void CheckBluetoothState(){

if (bluetoothAdapter == null){
stateBluetooth.setText("Bluetooth NOT support");
}

else {

if (bluetoothAdapter.isEnabled()){
if(bluetoothAdapter.isDiscovering()){
stateBluetooth.setText("Bluetooth is currently in device discovery process.");
}

else {
stateBluetooth.setText("Bluetooth is Enabled.");
btnListPairedDevices.setEnabled(true);
}
}

else {
stateBluetooth.setText("Bluetooth is NOT Enabled!");
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
}

}

private Button.OnClickListener btnListPairedDevicesOnClickListener
= new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(AppBT1.this, DeviceListActivity.class);
startActivityForResult(intent, REQUEST_PAIRED_DEVICE);
}};

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if(requestCode == REQUEST_ENABLE_BT){
CheckBluetoothState();
}

if (requestCode == REQUEST_PAIRED_DEVICE){
if(resultCode == RESULT_OK){

}
}
}
}
[/sourcecode]
DeviceListActivity.java

[sourcecode language=”java”]
package comunicacao.bluetooth;

import java.util.Set;

import android.app.ListActivity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class DeviceListActivity extends ListActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);

ArrayAdapter<String> btArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);

BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();

if (pairedDevices.size() > 0) {
for (BluetoothDevice device : pairedDevices) {
String deviceBTName = device.getName();
String deviceBTAddress = device.getAddress();
btArrayAdapter.add(deviceBTName + "\n" + deviceBTAddress);
}
}
setListAdapter(btArrayAdapter);
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);

Intent intent = new Intent();
setResult(RESULT_OK, intent);
finish();
}
}
[/sourcecode]

Os layouts XML:
main.xml

[sourcecode language=”xml”]
<!–?xml version=<i–>"1.0" encoding=<i>"utf-8"</i>?>
"http://schemas.android.com/apk/res/android"
android:orientation=<i>"vertical"</i>
android:layout_width=<i>"fill_parent"</i>
android:layout_height=<i>"fill_parent"</i>
>

<TextView
android:id=<i>"@+id/textView1"</i>
android:layout_width=<i>"wrap_content"</i>
android:layout_height=<i>"wrap_content"</i>
android:text=<i>"Estado do Bluetooth"</i>
android:textAppearance=<i>"?android:attr/textAppearanceMedium"</i> />

<TextView
android:id=<i>"@+id/bluetoothstate"</i>
android:layout_width=<i>"fill_parent"</i>
android:layout_height=<i>"wrap_content"</i>
/>

<Button
android:id=<i>"@+id/listpaireddevices"</i>
android:layout_width=<i>"fill_parent"</i>
android:layout_height=<i>"wrap_content"</i>
android:text=<i>"List Paired Devices"</i>
android:enabled=<i>"false"</i>
/>

<TextView
android:id=<i>"@+id/bluetoothstate"</i>
android:layout_width=<i>"fill_parent"</i>
android:layout_height=<i>"wrap_content"</i>
/>

[/sourcecode]

paired_devices.xml

[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

</LinearLayout>

</LinearLayout>

[/sourcecode]

E o Arquivo Manifest:

AndroidManifest.xml

[sourcecode language=”xml”]
<?xml version="1.0" encoding="UTF-8"?>
<manifest android:versionCode="1" android:versionName="1.0"
package="comunicacao.bluetooth" xmlns:android="http://schemas.android.com/apk/res/android">
<uses-sdk android:minSdkVersion="8"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<application android:label="@string/app_name">
<activity android:label="@string/app_name" android:name=".AppBT1">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:label="AppBT1: Lista de Dispositivos Pareados" android:name=".DeviceListActivity"/>
</application>
</manifest>

[/sourcecode]

Analisando o código: Permissões Bluetooth
Para usar os recursos Bluetooth em seu aplicativo, você precisa declarar pelo menos uma das duas permissões Bluetooth:
BLUETOOTH e BLUETOOTH_ADMIN.

Você deve solicitar a permissão BLUETOOTH para realizar qualquer comunicação Bluetooth, tais como solicitar uma conexão, aceitar uma conexão e transferir dados.
A permissão BLUETOOTH_ADMIN deve ser solicitada para iniciar a descoberta de dispositivos ou manipular as configurações de Bluetooth.
A maioria dos aplicativos precisa dessa permissão apenas para descobrir dispositivos Bluetooth locais. As outras capacidades concedidas por essa permissão não deve ser usado, a menos que o aplicativo seja um “gerenciador de energia”, que irá modificar as configurações de Bluetooth a pedido do utilizador.
Nota: Se você usar a permissão BLUETOOTH_ADMIN, então também deve iniciar a permissão BLUETOOTH.Declare a permissão Bluetooth no arquivo Manifest do aplicativo.

Nos próximos posts iremos mostrar a configuração e o uso do Bluetooth com o sistema OBDII.

Fonte:
http://developer.android.com/guide/topics/connectivity/bluetooth.html

Summary
Tutorial Android - Desenvolvendo com Bluetooth para comunicação veicular - Parte 1
Article Name
Tutorial Android - Desenvolvendo com Bluetooth para comunicação veicular - Parte 1
Description
Tutorial Android - Desenvolvendo com Bluetooth para comunicação veicular - Parte 1
Author
Publisher Name
iMobilis
Publisher Logo

7 Responses to “Tutorial Android – Desenvolvendo com Bluetooth para comunicação veicular – Parte 1”

  • Maravilha!

    Cara eu estava procurando exatamente um artigo sobre isso 🙂

    Já tenho o OBDII e tenho uma pequena exp. com Android rss
    fico no aguardo das proximas publicações.

  • Ótimo post, só que no meu esta dando erro :

    AppBT1.java

    23 setContentView(R.layout.main);
    24 btnListPairedDevices = (Button)findViewById(R.id.listpaireddevices);
    25 stateBluetooth = (TextView)findViewById(R.id.bluetoothstate);
    26 bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

    onde tem R.
    ta dando erro, tem e se eu importar a variavel R, aparece outros erros no programa, tem como resolver isso?

    • Camarada, você precisa inserir esses componentes na sua activity, um botão com o id listpaireddevices e um textview com o id bluetoothstate

  • Olá cavalheiros, ótimo tutorial, no entanto estou com erros na parte do manifest.

    segue:

    Error:Error retrieving parent for item: No resource found that matches the given name ‘android:TextAppearance.Material.Widget.Button.Inverse’.
    Error:Error retrieving parent for item: No resource found that matches the given name ‘android:Widget.Material.Button.Colored’.
    Error:Execution failed for task ‘:app:processDebugResources’.
    > com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    C:\Users\46597804813\AppData\Local\Android\Sdk\build-tools\21.1.2\aapt.exe package -f –no-crunch -I C:\Users\46597804813\AppData\Local\Android\Sdk\platforms\android-21\android.jar -M C:\Users\46597804813\AndroidStudioProjects\bluetoothteste\app\build\intermediates\manifests\full\debug\AndroidManifest.xml -S C:\Users\46597804813\AndroidStudioProjects\bluetoothteste\app\build\intermediates\res\debug -A C:\Users\46597804813\AndroidStudioProjects\bluetoothteste\app\build\intermediates\assets\debug -m -J C:\Users\46597804813\AndroidStudioProjects\bluetoothteste\app\build\generated\source\r\debug -F C:\Users\46597804813\AndroidStudioProjects\bluetoothteste\app\build\intermediates\res\resources-debug.ap_ –debug-mode –custom-package senai.bluetoothteste -0 apk –output-text-symbols C:\Users\46597804813\AndroidStudioProjects\bluetoothteste\app\build\intermediates\symbols\debug
    Error Code:
    1
    Output:
    C:\Users\46597804813\AndroidStudioProjects\bluetoothteste\app\build\intermediates\res\debug\values-v23\values.xml:5: error: Error retrieving parent for item: No resource found that matches the given name ‘android:TextAppearance.Material.Widget.Button.Inverse’.
    C:\Users\46597804813\AndroidStudioProjects\bluetoothteste\app\build\intermediates\res\debug\values-v23\values.xml:20: error: Error retrieving parent for item: No resource found that matches the given name ‘android:Widget.Material.Button.Colored’.

    alguma ideia?

    obrigado.

  • Olá cavalheiros, ótimo tutorial, no entanto estou com erros na parte do manifest.

    segue:

    Error:Error retrieving parent for item: No resource found that matches the given name ‘android:TextAppearance.Material.Widget.Button.Inverse’.
    Error:Error retrieving parent for item: No resource found that matches the given name ‘android:Widget.Material.Button.Colored’.
    Error:Execution failed for task ‘:app:processDebugResources’.
    > com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    C:\Users\teste\AppData\Local\Android\Sdk\build-tools\21.1.2\aapt.exe package -f –no-crunch -I C:\Users\teste\AppData\Local\Android\Sdk\platforms\android-21\android.jar -M C:\Users\teste\AndroidStudioProjects\bluetoothteste\app\build\intermediates\manifests\full\debug\AndroidManifest.xml -S C:\Users\teste\AndroidStudioProjects\bluetoothteste\app\build\intermediates\res\debug -A C:\Users\teste\AndroidStudioProjects\bluetoothteste\app\build\intermediates\assets\debug -m -J C:\Users\teste\AndroidStudioProjects\bluetoothteste\app\build\generated\source\r\debug -F C:\Users\teste\AndroidStudioProjects\bluetoothteste\app\build\intermediates\res\resources-debug.ap_ –debug-mode –custom-package senai.bluetoothteste -0 apk –output-text-symbols C:\Users\teste\AndroidStudioProjects\bluetoothteste\app\build\intermediates\symbols\debug
    Error Code:
    1
    Output:
    C:\Users\teste\AndroidStudioProjects\bluetoothteste\app\build\intermediates\res\debug\values-v23\values.xml:5: error: Error retrieving parent for item: No resource found that matches the given name ‘android:TextAppearance.Material.Widget.Button.Inverse’.
    C:\Users\teste\AndroidStudioProjects\bluetoothteste\app\build\intermediates\res\debug\values-v23\values.xml:20: error: Error retrieving parent for item: No resource found that matches the given name ‘android:Widget.Material.Button.Colored’.

    alguma ideia?

    obrigado.

Trackbacks & Pings

Deixe um comentário

O seu endereço de e-mail não será publicado.