не могу подключиться к блютуз гарнитуре в андроиде - PullRequest
0 голосов
/ 02 марта 2012

Пройдя почти два месяца по неверному пути, я понял, в чём была моя ошибка.Сейчас я поднимаю новую проблему, на которую не могу найти ответ: с помощью этой функции при попытке подключения к гарнитуре:

   mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET);
    final BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() {
        public void onServiceConnected(int profile, BluetoothProfile proxy) {
            if (profile == BluetoothProfile.HEADSET) {
                mBluetoothHeadset = (BluetoothHeadset) proxy;
            }
        }
        public void onServiceDisconnected(int profile) {
             if (profile == BluetoothProfile.HEADSET) {
                  mBluetoothHeadset = null;
             }
       }
    };

Я не могу инициализировать объект mBluetoothHeadset, по какой-то причине отладчик не может войти вфункция onServiceConnected ..

Любая помощь будет оценена по-настоящему ... действительно нужен один шай

Подробнее: Введено, что произошло после того, как после перезагрузки Android Android был включен, чтобы быть включенным, решено в коде: Это код функции: Log («PM.CheckForHeadSet», «In»);

    if (mBluetoothAdapter == null) {
        Log("PM.CheckForHeadSet","BlueTooth adapter not found");
        return "Error Bluetooth adapter";
    }
    switch (mBluetoothAdapter.getState()){
        case BluetoothAdapter.STATE_OFF: 
            Log("PM.CheckForHeadSet.getState"," STATE_OFF");
            mBluetoothAdapter.enable();
            break;
        case BluetoothAdapter.STATE_TURNING_ON:
            Log("PM.CheckForHeadSet.getState","STATE_TURNING_ON");
            break;
        case BluetoothAdapter.STATE_ON:
            Log("PM.CheckForHeadSet.getState","STATE_ON");
            break;
        case BluetoothAdapter.STATE_TURNING_OFF:
            Log("PM.CheckForHeadSet.getState","STATE_TURNING_OFF");
            break;
    }
    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();

    // If there are paired devices, add each one to the ArrayAdapter
    if (pairedDevices.size() == 1) {
        for (BluetoothDevice device : pairedDevices) 
            if(device.getBondState() == BluetoothDevice.BOND_BONDED){
                Log("PM.CheckForHeadSet Connected to:",device.getName());
            }
    }
    Log("PM.CheckForHeadSet ServiceListener:","In");
    final BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() {

        public void onServiceConnected(int profile, BluetoothProfile proxy) {
            if (profile == BluetoothProfile.HEADSET) {
                mBluetoothHeadset = (BluetoothHeadset) proxy;
                }
            }
        public void onServiceDisconnected(int profile) {
            if (profile == BluetoothProfile.HEADSET) {
                mBluetoothHeadset = null;        }
            }};
    if(mBluetoothHeadset == null)
        Log("PM.CheckForHeadSet","mBluetoothHeadset = null");
    else
        Log("PM.CheckForHeadSet","mBluetoothHeadset = " + mBluetoothHeadset.toString());
    if(context == null)
        Log("PM.CheckForHeadSet","context = null");
    else
        Log("PM.CheckForHeadSet","context = " + context.toString());

    if(mProfileListener == null)
        Log("PM.CheckForHeadSet","mProfileListener = null");
    else
        Log("PM.CheckForHeadSet","mProfileListener = " + mProfileListener.toString());

    if(mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET) == true)
         Log("PM.CheckForHeadSet.getProfileProxy","true");
    else        
        Log("PM.CheckForHeadSet.getProfileProxy","false"); 
    Log("PM.CheckForHeadSet","Out");
    return "Set Headset";

Если я размещаю GetProfileProxy над новым ProfileListener (как в примере с документом |), переменная mProfileListener по-прежнему равна нулю, а getProfileProxy возвращает false

И это logcat:

03-12 10:09:49.906: D/SpySitter(4205): PM.CheckForHeadSet-In
03-12 10:09:50.968: D/dalvikvm(4205): threadid=1: still suspended after undo (sc=1 dc=1)
03-12 10:09:59.453: D/SpySitter(4205): PM.CheckForHeadSet.getState-STATE_ON
03-12 10:10:02.640: D/SpySitter(4205): PM.CheckForHeadSet Connected to:-Motorola H790
03-12 10:10:04.226: D/SpySitter(4205): PM.CheckForHeadSet ServiceListener:-In
03-12 10:10:13.945: D/SpySitter(4205): PM.CheckForHeadSet-mBluetoothHeadset = null
03-12 10:10:17.984: D/SpySitter(4205): PM.CheckForHeadSet-context = android.app.Application@408472a0
03-12 10:10:21.820: D/SpySitter(4205): PM.CheckForHeadSet-mProfileListener = com.example.HelloForm.Tools$1@40894d00
03-12 10:10:28.796: D/SpySitter(4205): PM.CheckForHeadSet.getProfileProxy-true
03-12 10:10:31.226: D/SpySitter(4205): PM.CheckForHeadSet-Out

1 Ответ

0 голосов
/ 07 марта 2012

getProxyProfile возвращает false в трех случаях (это в соответствии с источником Android-15, поэтому он может немного отличаться в Android-11):

  • Контекст, переданный в null
  • Переданный в BluetoothProfile.ServiceListener нулевой
  • передаваемое int не является BluetoothProfile.HEADSET, BluetoothProfile.A2DP, BluetoothProfile.INPUT_DEVICE, BluetoothProfile.PAN или BluetoothProfile.HEALTH

Я бы предложил установить точку останова на вашем вызове getProxyProfile, чтобы выяснить, какой из этих случаев вызывает возвращаемое значение false.

изменить: Дополнительная информация

Bluetooth должен поддерживаться и включаться для вызова методов интерфейса. Если Bluetooth не поддерживается, getDefaultAdapter() вернет null. Если у вас есть адаптер, вы можете проверить, включен ли Bluetooth, позвонив на адаптер isEnabled(). Это довольно просто, так что вы, возможно, уже сделали это.

onServiceConnected вызывается членом android.content.ServiceConnection (mServiceConnection) в классе BluetoothHeadset, который, в свою очередь, вызывается ОС Android посредством вызова bindService, когда объект BluetoothHeadset создано. Если привязка этой службы не удалась, в журнале сообщений logcat должна появиться ошибка, например:

       "Could not bind to Bluetooth Headset Service"

с тегом «BluetoothHeadset». Если вы не видите эту ошибку, возможно, что-то работает под капотом.

И последнее замечание: Android поддерживает одновременно только одну подключенную гарнитуру. Убедитесь, что гарнитура не подключена, когда вы запускаете этот код. Аналогично, многие устройства поддерживают только одно соединение Bluetooth одновременно. Если это относится к вашему устройству, при запуске этого кода вы должны убедиться, что оно еще не подключено.

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

...