Android Bluetooth SPP con el Galaxy S3

Estoy tratando de establecer una conexión bluetooth entre un Samsung Galaxy S3 corriendo con Android 4.0.3 y un RN 42 Chip Bluetooth, aquí es el modelo :

He utilizado un montón de códigos diferentes para la configuración de una serie de bluetooth de la comunicación, y todos ellos están trabajando muy bien en el HTC Wildfire yo estaba usando antes. Pero ahora que estoy usando el galaxy s3 teléfono, es imposible establecer la conexión. Este es el código que estoy usando, me pareció aquí :

Puedo poner los permisos en el archivo de manifiesto de android.

Primero, mi Interfaz Bluetooth :

public class BtInterface {

private BluetoothDevice device = null;
private BluetoothSocket socket = null;
private InputStream receiveStream = null;
private OutputStream sendStream = null;

private ReceiverThread receiverThread;

Handler handler;

public BtInterface(Handler hstatus, Handler h) {
    Set<BluetoothDevice> setpairedDevices = BluetoothAdapter.getDefaultAdapter().getBondedDevices();
    BluetoothDevice[] pairedDevices = (BluetoothDevice[]) setpairedDevices.toArray(new BluetoothDevice[setpairedDevices.size()]);

    for(int i=0;i<pairedDevices.length;i++) {
        if(pairedDevices[i].getName().contains("MyBluetoothChip")) {
            device = pairedDevices[i];
            try {
                socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
                receiveStream = socket.getInputStream();
                sendStream = socket.getOutputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
            break;
        }
    }

    handler = hstatus;

    receiverThread = new ReceiverThread(h);
}

public void sendData(String data) {
    sendData(data, false);
}

public void sendData(String data, boolean deleteScheduledData) {
    try {
        sendStream.write(data.getBytes());
        sendStream.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void connect() {
    new Thread() {
        @Override public void run() {
            try {
                socket.connect();

                Message msg = handler.obtainMessage();
                msg.arg1 = 1;
                handler.sendMessage(msg);

                receiverThread.start();

            } catch (IOException e) {
                Log.v("N", "Connection Failed : "+e.getMessage());
                e.printStackTrace();
            }
        }
    }.start();
}

public void close() {
    try {
        socket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public BluetoothDevice getDevice() {
    return device;
}

private class ReceiverThread extends Thread {
    Handler handler;

    ReceiverThread(Handler h) {
        handler = h;
    }

    @Override public void run() {
        while(true) {
            try {
                if(receiveStream.available() > 0) {

                    byte buffer[] = new byte[100];
                    int k = receiveStream.read(buffer, 0, 100);

                    if(k > 0) {
                        byte rawdata[] = new byte[k];
                        for(int i=0;i<k;i++)
                            rawdata[i] = buffer[i];

                        String data = new String(rawdata);

                        Message msg = handler.obtainMessage();
                        Bundle b = new Bundle();
                        b.putString("receivedData", data);
                        msg.setData(b);
                        handler.sendMessage(msg);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
}

Entonces, mi actividad principal, con sólo un botón para conectar y conversar :

public class MonApp extends Activity implements OnClickListener {

private TextView logview;
private EditText sendtext;
private Button connect, send;

private BtInterface bt = null;

private long lastTime = 0;

final Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        String data = msg.getData().getString("receivedData");

        long t = System.currentTimeMillis();
        if(t-lastTime > 100) {//Pour Èviter que les messages soit coupÈs
            logview.append("\n");
            lastTime = System.currentTimeMillis();
        }
        logview.append(data);
    }
};

final Handler handlerStatus = new Handler() {
    public void handleMessage(Message msg) {
        int co = msg.arg1;
        if(co == 1) {
            logview.append("Connected\n");
        } else if(co == 2) {
            logview.append("Disconnected\n");
        }
    }
};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    bt = new BtInterface(handlerStatus, handler);

    logview = (TextView)findViewById(R.id.logview);
    sendtext = (EditText)findViewById(R.id.sendtxt);

    connect = (Button)findViewById(R.id.connect);
    connect.setOnClickListener(this);

    send = (Button)findViewById(R.id.send);
    send.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    if(v == connect) {
        bt.connect();
    } else if(v == send) {
        bt.sendData(sendtext.getText().toString());
    }
}
}

Cuando intento conectar con el chip, esto es lo que me sale en el logcat :

09-05 11:37:05.515: I/BluetoothPolicyService(2097): getBluetoothDataTransferAllowed 
09-05 11:37:05.520: D/BluetoothPolicyService(2097): MDM: isProfileEnabled = true
09-05 11:37:05.520: D/BluetoothUtils(6868): isSocketAllowedBySecurityPolicy start : device null
09-05 11:37:05.525: V/BluetoothService.cpp(2097): createDeviceNative
09-05 11:37:05.525: V/BluetoothService.cpp(2097): createDeviceNative
09-05 11:37:05.525: V/BluetoothEventLoop.cpp(2097): onCreateDeviceResult
09-05 11:37:05.525: V/BluetoothEventLoop.cpp(2097): onCreateDeviceResult
09-05 11:37:05.525: E/BluetoothEventLoop.cpp(2097): onCreateDeviceResult: D-Bus error: org.bluez.Error.AlreadyExists (Already Exists)
09-05 11:37:05.525: V/BluetoothService.cpp(2097): discoverServicesNative
09-05 11:37:05.525: V/BluetoothService.cpp(2097): ... Object Path = /org/bluez/3094/hci0/dev_00_06_66_43_A1_E6
09-05 11:37:05.525: V/BluetoothService.cpp(2097): ... Pattern = , strlen = 0
09-05 11:37:10.660: V/BluetoothEventLoop.cpp(2097): onDiscoverServicesResult
09-05 11:37:10.660: V/BluetoothEventLoop.cpp(2097): ... Device Path = /org/bluez/3094/hci0/dev_00_06_66_43_A1_E6
09-05 11:37:10.660: E/BluetoothEventLoop.cpp(2097): onDiscoverServicesResult: D-Bus error: org.bluez.Error.ConnectionAttemptFailed (Host is down)
09-05 11:37:10.670: V/N(6868): Connection Failed : Service discovery failed
09-05 11:37:10.670: W/System.err(6868): java.io.IOException: Service discovery failed
09-05 11:37:10.675: W/System.err(6868):     at android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:462)
09-05 11:37:10.675: W/System.err(6868):     at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:240)
09-05 11:37:10.675: W/System.err(6868):     at com.example.bluetooth.BtInterface$1.run(BtInterface.java:68)

No me di cuenta de por qué este código no funciona con el galaxy s3. Traté de buscar en google acerca de bluetooth problemas de compatibilidad, pero no he encontrado nada hasta ahora.

Gracias !

Guillaume

InformationsquelleAutor user1622445 | 2012-09-05

2 Kommentare

  1. 4

    Hay un montón de Bluetooth problemas de incompatibilidad con el nuevo Android ICS. Al parecer metido con el Bluetooth de código para «mejorar la seguridad».

    Un error he encontrado y reportado(que hizo que toda mi incrustado de la junta no es capaz de conectarse durante una semana con cualquier dispositivo Android ICS) fue que al establecer una conexión a un dispositivo vinculado, Android ICS requeriría re-autenticación – con o sin PIN depende de si usted utiliza Bluetooth SSP (yo lo uso – esto significa que, para mí, en Android ICS conexión de 2 de la servidumbre de los dispositivos todavía es posible sin la interacción del usuario -, pero se tarda un poco más).

    Favor de votar este error en Google Bugtracker – tal vez alguien va a solucionarlo…

    Tal vez esta es tu problema? Puede especificar exactamente en qué línea de su código se rompe?
    Rodea todo su sistema Bluetooth de código con try/catch, etc.

    De todos modos, el nuevo Bluetooth comportamiento es muy, muy malo, he oído hablar de un montón de gente no es capaz de conectarse a su antiguo auricular a causa de ella.

    • Gracias por tu respuesta, vi también que están teniendo un montón de problemas con ICS… finalmente encontré una manera de hacer que funcione, yo uso ahora este código para configurar la conexión, con un inseguro Rfcomm : device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(macAddress); Método m = dispositivo.getClass().getMethod(«createInsecureRfcommSocket», lo nuevo de la Clase[] { int.class }); socket = (BluetoothSocket)m.invoke(dispositivo Entero.valueOf(1));
    • Así fue que error! No olvides que la conexión no es segura en este caso! (Ver también el uso de la reflexión…para la compatibilidad probablemente). Pls también votar correcta y tal vez en el Google Android rastreador de errores, así que si usted tiene el tiempo?!
    • He encontrado el mismo problema, así que he de usar insucure conexión, pero no funcionó :(..!! Tiene algunos encontrado el mismo proble en GALAXY TAB 2.7.0 ??
  2. 1

    El código parece correcto, pero como Radu dijo que el nuevo Bluetooth comportamiento si no es bueno.
    Yo tenía bastantes problemas a mí mismo (con Android 4.1+) y finalmente se utiliza BlueTerm como base para mi aplicación, ya que es de código abierto y está trabajando (al menos para la conexión de la parte).

    Usted puede encontrar sus fuentes aquí :

    http://pymasde.es/blueterm/

    Espero que pueda ayudar a usted !

    D

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea