![](/img/trans.png)
[英]Pairing with SPP bluetooth device crashes Samsung Galaxy S (Android 2.2)
[英]Android Bluetooth SPP with Galaxy S3
我正在嘗試在運行Android 4.0.3的三星Galaxy S3和RN 42藍牙芯片之間建立藍牙連接, 這是模型:
我使用了許多不同的代碼來建立藍牙串行通信,並且所有這些代碼在我以前使用的HTC Wildfire上都運行良好。 但是現在我正在使用galaxy s3手機,因此無法建立連接。 這是我正在使用的代碼,我在這里找到了 :
我把權限放在android清單中。
首先,我的藍牙接口:
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();
}
}
}
}
}
然后,我的主要活動是,只有一個連接按鈕和一個聊天窗口:
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());
}
}
}
當我嘗試連接到芯片時,這就是我從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)
我無法弄清楚為什么此代碼不適用於s3。 我試圖在Google上搜索有關藍牙兼容性的問題,但到目前為止我什么都沒找到。
謝謝 !
紀堯姆
新的Android ICS存在很多藍牙不兼容問題。 顯然,他們搞亂了藍牙代碼以“提高安全性”。
我發現並報告了一個錯誤 (這使我的整個嵌入式板都無法與任何Android ICS設備連接一周)是當與已配對的設備建立連接時,Android ICS需要重新認證-帶有或不帶有PIN碼取決於您是否使用藍牙SSP (我使用它-這對我來說,在Android ICS上,無需用戶交互,仍然可以連接2個綁定設備-但需要更長的時間)。
請在Google Bugtracker上對該錯誤進行投票-也許有人會對其進行修復...
也許這也是您的問題? 您能確切指定代碼在哪一行中斷嗎? 用try / catch等將您的所有Bluetooth系統代碼括起來。
無論如何,新的藍牙行為非常糟糕,我聽說很多人因此而無法連接到舊耳機。
您的代碼似乎正確,但是正如Radu所說,新的藍牙行為並不是那么好。 我確實遇到了很多麻煩(使用Android 4.1+),最后還是將BlueTerm用作我的應用程序的基礎,因為它是開源的並且可以正常工作(至少對於連接部分而言)。
您可以在這里找到其來源:
http://pymasde.es/blueterm/
希望它能對您有所幫助!
d
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.