Estoy desarrollando una aplicación en la que tengo que conectar al dispositivo Bluetooth en Android 4.3.

Puedo escanear el dispositivo bluetooth, pero no puedo conectar el dispositivo bluetooth.

Ya he agregar el permiso en el Manifiesto de los siguientes:

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />

De mi Operación es cuando me empuje el Botón de ESCANEO, que se va a escanear el dispositivo Bluetooth y mostrar en el ListView.

Cuando hago clic en el dispositivo bluetooth en el ListView,se conecta el dispositivo bluetooth de elemento.

Pero cuando hago clic en el elemento del dispositivo, la aplicación se bloquea, y no sé por qué…

Este es mi código java:

     package com.example.preventthelost;
import java.io.IOException;
import java.net.Socket;
import java.util.Set;
import java.util.UUID;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
public class DeviceList extends Activity {
protected static final String tag = "TAG";
private BluetoothAdapter mBluetoothAdapter;
private static final int REQUEST_ENABLE_BT=1;
private Button btn_cancel;
private Button btn_scan;
private ListView pair_devices_list;
private ListView new_devices_list;
private Set<BluetoothDevice> pairedDevice;
private ArrayAdapter<String> newDevicelistArrayAdapter;
private ArrayAdapter<String> pairDevicelistArrayAdapter;
private final UUID my_UUID = UUID.fromString("00001802-0000-1000-8000-00805f9b34fb");
//private final UUID my_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private BluetoothSocket socket;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.device_list);
btn_scan = (Button)findViewById(R.id.btn_scan);
newDevicelistArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name);
new_devices_list = (ListView)findViewById(R.id.new_devices_list);
new_devices_list.setAdapter(newDevicelistArrayAdapter);
         **//check device support bluetooth or not**
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(mBluetoothAdapter == null) {
Toast.makeText(this, "No support bluetooth", Toast.LENGTH_SHORT).show();
finish();
return;
}else if(!mBluetoothAdapter.isEnabled()){ **//if bluetooth is close, than open it**
Intent enableBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBTIntent, REQUEST_ENABLE_BT);
}
**//click the scan button**
btn_scan.setOnClickListener(new OnClickListener() {         
@Override
public void onClick(View v) {
//TODO Auto-generated method stub
//**list the bluetooth device**
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter);
mBluetoothAdapter.startDiscovery();
newDevicelistArrayAdapter.clear();
}
});
//new_devices_list click
new_devices_list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
//TODO Auto-generated method stub          
mBluetoothAdapter.cancelDiscovery();
final String info = ((TextView) arg1).getText().toString();
             //get the device address when click the device item
String address = info.substring(info.length()-19);
//connect the device when item is click
          BluetoothDevice connect_device = mBluetoothAdapter.getRemoteDevice(address);
try {
socket = connect_device.createRfcommSocketToServiceRecord(my_UUID);
socket.connect();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
});//************new_devices_list end
}
public final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//TODO Auto-generated method stub
String action = intent.getAction();
if(BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice bdevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);              
//short rssi = intent.getExtras().getShort(BluetoothDevice.EXTRA_RSSI);;
if(bdevice.getBondState() != BluetoothDevice.BOND_BONDED)   
newDevicelistArrayAdapter.add("\n" + bdevice.getName() + "\n" + bdevice.getAddress());
newDevicelistArrayAdapter.notifyDataSetChanged();
}
}
};
protected void onDestroy() {
super.onDestroy();
if(mBluetoothAdapter != null)
mBluetoothAdapter.cancelDiscovery();
unregisterReceiver(mReceiver);
}
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.device_list, menu);
return true;
}
}

cuando yo escriba el conectar código siguiente en new_devices_list.setOnItemClickListener, siempre accidente.

//get the device address when click the device item
String address = info.substring(info.length()-19);
//connect the device when item is click
BluetoothDevice connect_device = mBluetoothAdapter.getRemoteDevice(address);
try {
socket = connect_device.createRfcommSocketToServiceRecord(my_UUID);
socket.connect();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}

No estoy seguro, pero el problema en esta línea:

BluetoothDevice connect_device = mBluetoothAdapter.getRemoteDevice(address);

El tipo de datos de la address es de Cadena en lugar de la dirección.

Pero el tipo de getRemoteDevice puedo elegir es la Cadena de dirección.

ASÍ que…no sé por Qué la aplicación siempre accidente cuando yo escriba el conectar código en new_devices_list incluso??

Qué no se puede utilizar en Android 4.3 ??

Alguien puede enseñarme??

Gracias!!

  • plz publicar sus logcat cuando la aplicación se bloquea
  • El logcat show «xx:xx:xx:xx:xx:xx» no es una dirección de Bluetooth por Lo que el problema está en el tipo de datos de la dirección, pero el tipo de getRemoteDevice puedo elegir es la Cadena de dirección. Cómo hacerlo?
InformationsquelleAutor Wun | 2013-10-02

3 Comentarios

  1. 3

    No estaba claro si se conecta el Bluetooth Clásico o una Baja de Energía del dispositivo. Su código es para el Clásico, la etiqueta sugiere poca Energía. En caso de que el Bajo consumo de Energía que utilizaría

    device.connectGatt(this, false, mGattCallback);

    lugar de

    connect_device.createRfcommSocketToServiceRecord(my_UUID);
  2. 1

    Selecciona la Etiqueta de BluetoothLowEnergy. Tu pregunta es acerca de BLE o estándar de Bluetooth? para BLE existe otro enfoque para conectarse. Usted puede leer aquí

  3. 1

    He tenido un problema similar, pero sólo se ha encontrado una solución.

    Vez de restar 19 de info.length() en

    String address = info.substring(info.length()-19);

    restar 17 lugar. El post original es publicado hace casi un año, pero esperemos que todavía útil para aquellos que tienen el mismo problema.

Dejar respuesta

Please enter your comment!
Please enter your name here