Android Bluetooth SPP avec Galaxy S3
Je suis en train d'établir une connexion bluetooth entre un Samsung Galaxy S3 en cours d'exécution avec Android 4.0.3 et un RN 42 Puce Bluetooth, ici est le modèle :
J'ai utilisé beaucoup de codes différents pour la création d'une série bluetooth de communication, et ils sont tous fonctionne très bien sur HTC Wildfire que j'utilisais avant. Mais maintenant que je suis en utilisant le galaxy s3 téléphone, il est impossible d'établir la connexion. Voici le code que j'utilise, je l'ai trouvé ici :
J'ai mis les autorisations dans le manifeste android.
Tout d'abord, mon Interface 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();
}
}
}
}
}
Alors, mon activité principale, avec juste un bouton pour vous connecter et un chat :
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());
}
}
}
Lorsque j'essaie de connecter la puce, c'est ce que je reçois de la 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)
Je ne peux pas compris pourquoi ce code ne fonctionne pas avec le galaxy s3. J'ai essayé de chercher sur google à propos de la compatibilité bluetooth questions, mais je n'ai rien trouvé jusqu'à présent.
Merci !
Guillaume
Vous devez vous connecter pour publier un commentaire.
Il y a beaucoup de Bluetooth de problèmes d'incompatibilité avec le nouveau Android ICS. Apparemment ils ont foiré autour avec le Bluetooth de code pour "améliorer la sécurité".
Un bug j'ai trouvé et signalé(ce qui fait tout mon incorporé conseil ne sont pas en mesure de se connecter pendant une semaine avec n'importe quel appareil Android ICS) a été que, pour établir une connexion à un appareil lié, Android ICS aurait besoin d'un re-authentification - avec ou sans PIN dépend de si vous utilisez Bluetooth SSP (je l'utilise, ce qui signifie que pour moi, sur Android ICS connexion de 2 cautionné dispositifs est toujours possible sans interaction de l'utilisateur, mais il faut un peu plus).
S'il vous plaît voter ce bug sur Google Bugtracker - peut-être que quelqu'un va le corriger...
C'est peut-être votre problème? Pouvez-vous préciser exactement à ce que la ligne de votre code pauses?
Surround tous vos Bluetooth système de code avec try/catch, etc.
De toute façon, le nouveau Bluetooth comportement est très très mauvais, j'ai entendu parler de beaucoup de gens de ne pas être en mesure de se connecter à leurs vieux casque à cause de cela.
Votre code semble correct, mais comme Radu dit, le nouveau Bluetooth comportement si pas bon.
J'ai eu quelques ennuis de moi-même (avec Android 4.1+) et enfin utilisé BlueTerm comme base pour mon application, car il est opensource et fonctionne (au moins pour le raccordement de la partie).
Vous pouvez trouver ses sources ici :
http://pymasde.es/blueterm/
J'espère que cela peut vous aider !
D