HI,
Я видел точно такую же проблему (HTC Desire).Несмотря на закрытие сокета книгой (как предлагает Брэд), следующий метод connect () блокируется навсегда - пока не завершится close () другим потоком.
Я обошел проблему, всегда вызывая BluetoothAdapter.disable () /.enable () перед подключением.Ужасный, недружественный взлом, я знаю ...
Я подозреваю, что некоторые из существующих проблем с BT связаны с конкретным производителем, так как некоторые разработчики приложений, кажется, счастливо живут с createRfcommSocketToServiceRecord (), который определенно не работает на моем HTC Desire (Android 2.1, обновление 1).
Я видел признаки (извините, не имею ссылок), что стек BT HTC Desire отличается от Nexus One, хотя кажется, что они очень похожи на устройства ...
BR Per
(дополнение) Вот очень простое упражнение для воспроизведения проблемы (без моего отключения / включения 'лечения'):
package com.care2wear.BtTest;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class BtTestActivity extends Activity {
private static final String TAG="BtTest";
BluetoothAdapter mBtAdapter = null;
BluetoothDevice mBtDev = null;
BluetoothSocket mBtSocket = null;
InputStream isBt;
OutputStream osBt;
String mAddress = "00:18:E4:1C:A4:66";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
connect(); // ok
disconnect(); // ok
connect(); // this invariably fails - blocked until BT is switched off by someone else, or the peer device turns off/goes out of range
disconnect();
}
private void init() {
Log.d(TAG, "initializing");
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
mBtDev = mBtAdapter.getRemoteDevice(mAddress);
Log.d(TAG, "initialized");
}
private void connect() {
try {
Log.d(TAG, "connecting");
Method m = mBtDev.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
mBtSocket = (BluetoothSocket) m.invoke(mBtDev, 1);
mBtSocket.connect();
Log.d(TAG, "connected");
} catch (SecurityException e) {
Log.e(TAG, "SecEx", e);
} catch (NoSuchMethodException e) {
Log.e(TAG, "NsmEx", e);
} catch (IllegalArgumentException e) {
Log.e(TAG, "IArgEx", e);
} catch (IllegalAccessException e) {
Log.e(TAG, "IAccEx", e);
} catch (InvocationTargetException e) {
Log.e(TAG, "ItEx", e);
} catch (IOException e) {
Log.e(TAG, "IOEx", e);
}
}
private void disconnect() {
Log.d(TAG, "closing");
if (isBt != null) {
try {
isBt.close();
} catch (IOException e) {
Log.e(TAG, "isBt IOE", e);
}
isBt = null;
}
if (osBt != null) {
try {
osBt.close();
} catch (IOException e) {
Log.e(TAG, "osBt IOE", e);
}
osBt = null;
}
if (mBtSocket != null) {
try {
mBtSocket.close();
} catch (IOException e) {
Log.e(TAG, "socket IOE", e);
}
mBtSocket = null;
}
Log.d(TAG, "closed");
}
}
Еслилюбой может заметить, если я делаю это неправильно, не стесняйтесь комментировать:)
(дополнение 2) Я думаю, что я получил его на работу сейчас:
- Официальный метод подключения RFCOMM (через SDP) теперь, похоже, действительно работает (HTC Desire, 2.1, обновление 1), НО Мне пришлось удалить и заново подключить устройство BT.Перейдите к рисунку ..
- Переподключение все равно может завершиться неудачей (ошибка обнаружения службы), если я переподключусь «слишком быстро» (выйдите из приложения, а затем немедленно перезапустите).Думаю, соединение еще не полностью разорвано.
- Если я всегда заканчиваю (последнее) действие не только с помощью finish (), но и с помощью Runtime.getRuntime (). Exit (0);намного лучшеПойди разберись снова ...
Если кто-нибудь сможет это объяснить, я с удовольствием научусь./ Per
(дополнение 3) Наконец-то получено обновление Froyo (2.2) для моего Desire, и, насколько я вижу, SPP теперь работает :) / Per