2012-03-13 4 views
52

У меня есть приложение с кнопкой на нем, которое я использую для включения и выключения BT. У меня есть следующий код;Обнаружение изменений состояния, внесенных в адаптер Bluetooth?

public void buttonFlip(View view) { 
    flipBT(); 
    buttonText(view); 
} 

public void buttonText(View view) { 
    Button buttonText = (Button) findViewById(R.id.button1); 
    if (mBluetoothAdapter.isEnabled() || (mBluetoothAdapter.a)) { 
     buttonText.setText(R.string.bluetooth_on); 
    } else { 
     buttonText.setText(R.string.bluetooth_off); 
    } 
} 

private void flipBT() { 
    if (mBluetoothAdapter.isEnabled()) { 
     mBluetoothAdapter.disable();  
    } else { 
     mBluetoothAdapter.enable(); 
    } 
} 

Я звоню кнопку Flip, который переворачивает состояние BT, а затем вызывает ButtonText, которые должны обновить пользовательский интерфейс. Тем не менее, проблема, с которой я столкнулся, - это займет несколько секунд, пока BT не включится - и в течение этих секунд статус BT не включен, поэтому моя кнопка говорит о отключении Bluetooth, даже если он будет включен через 2 секунды.

Я нашел константу STATE_CONNECTING в документации по Android-адаптеру BluetoothAdapter, но ... Я просто не знаю, как ее использовать, будучи новичком и всеми.

Итак, у меня есть два вопроса:

  1. Есть ли способ, чтобы динамически связать элемент пользовательского интерфейса (например, кнопки или изображения) в состояние BT, так что, когда изменения состояния BT, кнопка также изменится?
  2. В противном случае я бы хотел нажать кнопку и получить правильное состояние (я бы хотел, чтобы он сказал BT, даже если это только соединение, так как оно будет включено через 2 секунды). Как мне это сделать?
+0

вы не можете использовать логическое значение и установить его на истинный раз BT начинает включения, а затем проверить логическое состояние, чтобы изменить кнопка? –

+0

Посмотрите на этот код AOSP, чтобы понять, как они отслеживают изменения вкл/выкл Bluetooth: http://androidxref.com/5.1.0_r1/xref/frameworks/base/services/core/java/com/ android/server/BluetoothManagerService.java –

ответ

149

Вы хотите зарегистрировать BroadcastReceiver слушать каких-либо изменений в состоянии BluetoothAdapter:

В качестве частной переменной экземпляра в ваш Activity (или в отдельном файле класса ... какой бы ни один вас предпочитают):

private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final String action = intent.getAction(); 

     if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { 
      final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 
               BluetoothAdapter.ERROR); 
      switch (state) { 
      case BluetoothAdapter.STATE_OFF: 
       setButtonText("Bluetooth off"); 
       break; 
      case BluetoothAdapter.STATE_TURNING_OFF: 
       setButtonText("Turning Bluetooth off..."); 
       break; 
      case BluetoothAdapter.STATE_ON: 
       setButtonText("Bluetooth on"); 
       break; 
      case BluetoothAdapter.STATE_TURNING_ON: 
       setButtonText("Turning Bluetooth on..."); 
       break; 
      } 
     } 
    } 
}; 

Обратите внимание, что это предполагает, что ваш Activity реализует метод setButtonText(String text), который изменит текст Button «s соответственно.

И тогда в вашем Activity, регистрации и отмены регистрации BroadcastReceiver следующим образом,

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    /* ... */ 

    // Register for broadcasts on BluetoothAdapter state change 
    IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); 
    registerReceiver(mReceiver, filter); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 

    /* ... */ 

    // Unregister broadcast listeners 
    unregisterReceiver(mReceiver); 
} 
+0

Алекс, это почти работает. несколько вещей. во-первых, я думаю, вы хотели зарегистрировать BluetoothAdapter, а не BluetoothDevice, поскольку BluetoothDevice - это когда вы соединяете устройство, и у него есть только BluetoothDevice.ACTION_BOND_STATE_CHANGED, который здесь не применим. Я также добавил a; после кода broadcastReceiver (я только пишу это для будущих людей, у которых будет такая же проблема, и прочитайте это), однако я получаю «Java.lang.RuntimeException: Невозможно создать экземпляр Activity ComponInfo», что обычно означает моя активность не зарегистрирована в манифесте - мне нужно зарегистрировать приемник там? – raingod

+0

ha! я идиот :) Я понял свою проблему. так что, да, кроме кода, о котором я упоминал там, это прекрасно работает :) Спасибо Алекс! – raingod

+0

без проблем! извините за опечатки ... поскольку я печатал это, я знал, что должно быть пара :). –

Смежные вопросы