Проблемы с Bluetooth на HTC Hero

Я написал приложение для Android, получающее данные от внешних датчиков через Bluetooth. Он отлично работает на Sony Ericsson XPERIA, но не на HTC Hero (он находит внешние устройства, но не может получить от них никаких данных) Мне интересно, почему. После некоторых исследований в сети, я до сих пор не нашел никакой подсказки. У кого-нибудь были похожие проблемы с Bluetooth на HTC?

3 ответа

Вы можете сделать это так:

private final String PBAP_UUID = "0000112f-0000-1000-8000-00805f9b34fb"; //standard pbap uuid            
mSocket = mDevice.createInsecureRfcommSocketToServiceRecord(ParcelUuid.fromString(PBAP_UUID).getUuid())    
mSocket.connect();

Просто сделай это.

Если я правильно помню, телефоны HTC имели или [имеют] проблему на определенном уровне API (возможно, 2.1 и ниже?). Разрешение является отражением.

Ссылка

Отключите разъем Bluetooth в Android

Обнаружение службы не удалось исключение при использовании Bluetooth на Android

Решение

Вместо того, чтобы использовать

tmp = device.createRfcommSocketToServiceRecord(MY_UUID);

использование

Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
tmp = (BluetoothSocket) m.invoke(device, 1);

чтобы получить BluetoothSocket на определенных телефонах HTC, используя определенный уровень API.

Решение расширено

Недавно у меня было приложение, в котором я должен был это учитывать, и мне не нравилось использовать его на телефонах, отличных от HTC, поэтому у меня было условие проверить HTC, если true, то использовать отражение, в противном случае - нет.

public BTConnectThread(BluetoothDevice device) {

    mmDevice = device;
    BluetoothSocket tmp = null;

    // Get a BluetoothSocket for a connection with the given BluetoothDevice
    if (isAnHTCDevice()) 
    {
        try 
        {
            Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
            tmp = (BluetoothSocket) m.invoke(device, Integer.valueOf(1));
        } 
        catch (Exception e) 
        {
            Log.e(BCTAG, "Error at HTC/createRfcommSocket: " + e);
            e.printStackTrace();
            handler.sendMessage(handler.obtainMessage(MSG_BT_LOG_MESSAGE, "Exception creating htc socket: " + e));
        }
    } 
    else 
    {
        try 
        {
            UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
            tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
        } catch (Exception e) 
        {
            Log.e(BCTAG, "Error at createRfcommSocketToServiceRecord: " + e);
            e.printStackTrace();
            handler.sendMessage(handler.obtainMessage(MSG_BT_LOG_MESSAGE, "Exception creating socket: " + e));
        }
    }

    mmSocket = tmp;
}

isAnHTCDevice ():

public boolean isAnHTCDevice()
{
    String manufacturer = android.os.Build.MANUFACTURER;
    if (manufacturer.toLowerCase().contains("htc"))
        return true;
    else
        return false;
}

Вы можете сделать это так:

private final String PBAP_UUID = "0000112f-0000-1000-8000-00805f9b34fb"; //standard pbap uuid

mSocket = mDevice.createInsecureRfcommSocketToServiceRecord(ParcelUuid.fromString(PBAP_UUID).getUuid());

mSocket.connect ();

Просто сделай это.

Другие вопросы по тегам