Android Bluetooth SPP с Galaxy S3

Я пытаюсь установить Bluetooth-соединение между Samsung Galaxy S3 под управлением Android 4.0.3 и Bluetooth-чипом RN 42, вот модель:

Я использовал множество различных кодов для настройки последовательной связи Bluetooth, и все они очень хорошо работают на HTC Wildfire, который я использовал раньше. Но теперь, когда я использую телефон galaxy s3, невозможно установить связь. Вот код, который я использую, я нашел его здесь :

Я помещаю разрешения в манифест Android.

Во-первых, мой интерфейс 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();
            }
        }
    }
}
}

Затем моя основная деятельность, всего лишь кнопка для подключения и чат:

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)

Я не могу понять, почему этот код не работает с galaxy s3. Я пытался найти в Google информацию о проблемах совместимости Bluetooth, но пока ничего не нашел.

Спасибо !

Гийом


person user1622445    schedule 05.09.2012    source источник


Ответы (1)


Существует множество проблем с несовместимостью Bluetooth с новым Android ICS. Очевидно, они возились с кодом Bluetooth, чтобы «улучшить безопасность».

ошибка Я обнаружил и сообщил (из-за чего вся моя встроенная плата не могла в течение недели подключаться к любому устройству Android ICS) было то, что при установлении соединения с уже сопряженным устройством Android ICS требовала повторной аутентификации — с или без PIN-код зависит от того, используете ли вы Bluetooth SSP (я использую его - это означает, что для меня, на Соединение Android ICS двух связанных устройств по-прежнему возможно без взаимодействия с пользователем, но это занимает немного больше времени).

Проголосуйте за это ошибка в Google Bugtracker - может кто исправит...

Может это и ваша проблема? Можете ли вы точно указать, на какой строке ваш код прерывается? Окружите весь код вашей системы Bluetooth с помощью try/catch и т. д.

В любом случае, новое поведение Bluetooth очень и очень плохое, я слышал, что многие люди не могут из-за этого подключиться к своей старой гарнитуре.

person Radu    schedule 05.09.2012
comment
Спасибо за ваш ответ, я также видел, что у них много проблем с ICS ... я наконец нашел способ заставить его работать, теперь я использую этот код для настройки соединения с небезопасным Rfcomm: устройство = BluetoothAdapter .getDefaultAdapter().getRemoteDevice(macAddress); Метод m = device.getClass().getMethod(createInsecureRfcommSocket, новый класс[] {int.class}); socket = (BluetoothSocket)m.invoke(устройство, Integer.valueOf(1)); - person user1622445; 05.09.2012
comment
Так это был тот самый баг! Не забывайте, что в этом случае соединение небезопасно! (Я вижу, вы также используете отражение... возможно, для совместимости). Пожалуйста, также проголосуйте за / исправьте и, возможно, также в Google Android Bugtracker, если у вас есть время ?! - person Radu; 05.09.2012
comment
Я обнаружил ту же проблему, поэтому я попытался использовать небезопасное соединение, но это не сработало :(..!! Кто-нибудь нашел ту же проблему на GALAXY TAB 2.7.0 ?? - person Bomberlatinos9; 20.02.2014