安卓蓝牙SPP与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("Connectedn");
        } else if(co == 2) {
            logview.append("Disconnectedn");
        }
    }
};
/** 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)

我不明白为什么这个代码不适用于galaxy s3。我试着在谷歌上搜索蓝牙兼容性问题,但到目前为止我没有找到任何东西。

谢谢!

Guillaume

新的Android ICS存在大量蓝牙不兼容问题。显然,他们为了"提高安全性"而篡改了蓝牙代码。

我发现并报告的一个错误(导致我的整个嵌入式板在一周内无法与任何Android ICS设备连接)是,当建立与已经配对的设备的连接时,安卓ICS需要重新验证-是否使用PIN取决于您是否使用蓝牙SSP(我使用它-这意味着对我来说,在安卓ICS上,2个绑定设备的连接仍然可以在没有用户交互的情况下进行-但需要更长的时间)。

请在谷歌Bugtracker上投票这个bug-也许有人会修复它…

也许这也是你的问题?你能具体说明你的代码在哪一行中断吗?使用try/catch等环绕所有蓝牙系统代码

不管怎样,新的蓝牙行为非常非常糟糕,我听说很多人因此无法连接到他们的旧耳机。

您的代码似乎是正确的,但正如Radu所说,新的蓝牙行为并没有那么好。我自己(使用Android 4.1+)确实遇到了一些麻烦,最终使用了BlueTerm作为我的应用程序的基础,因为它是开源的,并且正在运行(至少对于连接部分)

您可以在此处找到其来源:
http://pymasde.es/blueterm/

我希望它能帮助你
D

最新更新