2013-12-04 3 views
0

Итак, я взломал голову, как проверить текущее состояние обнаружения Bluetooth. Я хочу иметь дело с простой проблемой: Когда пользователь начинает обнаружение Bluetooth на устройстве, нажав кнопку, он открывает журнал с разрешением, позволяющим обнаруживать Bluetooth. Когда пользователь соглашается, он включен, а другая кнопка включена. Но когда пользователь это отрицает, следующая кнопка всегда включена, а предыдущая становится недоступной.Проверить текущее состояние обнаружения Bluetooth

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

Можно ли вернуть текущее состояние к некоторой переменной? Если да, то как?

Я пытался использовать некоторые переменные, которые зависели от BTDiscoverable(); но без везения.

Я проверил этот Android SDK documentation, но говорится только о включении, выключении или проверке текущего состояния.

public void onClick(View v) { 
    Button bttn = (Button) v; 

    if(bttn.getId() == R.id.bt_server_start) 
    { 
     /* 
     * If BluetoothAdapter name does not start with BT_ prefix, add it to the name, then proceed 
     */ 
     if (!mBluetoothAdapter.getName().startsWith(PREFIX)) 
      mBluetoothAdapter.setName(PREFIX + mBluetoothAdapter.getName()); 
     /* 
     * Check the connectability/discoverability, compare to the statemanet made by user that it is enabled. 
     * If they are not equal, run BTDiscoverable method - set device to be discoverable by other devices 
     */ 
     if(mBluetoothAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) 
      BTDiscoverable(); 

     /* 
     * As the bluetooth is now on and the device can be connected/discovered, USER MUST START THE SERVER SITE ON DEVICE BY 
     * CREATING NEW THREAD 
     */ 

     DeviceServer = new AcceptThread(); 

     /* 
     * Start the thread 
     */ 
     DeviceServer.start(); 

     /* 
     * Set the availability of the button 
     */ 

     bttn.setEnabled(false); 
     ((Button) this.findViewById(R.id.bt_server_stop)).setEnabled(true); 

     } else if (bttn.getId() == R.id.bt_server_stop) 
     { 
      DeviceServer.cancel(); 
      bttn.setEnabled(false); 
      ((Button) this.findViewById(R.id.bt_server_start)).setEnabled(true); 
      BTDeviceName(); 
     } 
} 

EDIT: Ну, использование этой команды снова дает результат, который я ожидал.

if(mBluetoothAdapter.getScanMode()==BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) 

ответ

1

Вы используете библиотеку или используете функцию BTDiscoverable(), которую вы создали?

В Android, то Discoverability устанавливается с помощью намерения

Intent discoverableIntent = new 
Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); 
startActivity(discoverableIntent); 

(см http://developer.android.com/guide/topics/connectivity/bluetooth.html#EnablingDiscoverability)

Так что, если я вас правильно понимаю, что вы могли бы сделать, это: запуск этого намерения (или использовать BTDiscoverable, если он эквивалентен), return. Кнопка остается включенной. Если пользователь принял понятности, в следующий раз, когда он/она будет нажать на кнопку, то код будет выполняться цикл еще и запустить сервер, в противном случае он будет просить разрешение снова

public void onClick(View v) { 
    Button bttn = (Button) v; 

    if(bttn.getId() == R.id.bt_server_start) 
    { 
     /* 
     * If BluetoothAdapter name does not start with BT_ prefix, add it to the name, then proceed 
     */ 
     if (!mBluetoothAdapter.getName().startsWith(PREFIX)) 
      mBluetoothAdapter.setName(PREFIX + mBluetoothAdapter.getName()); 
     /* 
     * Check the connectability/discoverability, compare to the statemanet made by user that it is enabled. 
     * If they are not equal, run BTDiscoverable method - set device to be discoverable by other devices 
     */ 
     if(mBluetoothAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) 
     { 
      (If your BTDiscoverable is this equivalent if this, you can use it) 
      Intent discoverableIntent = new 
      Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
      discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); 
      startActivity(discoverableIntent); 

     } 
     else 
     { 
      /* 
      * As the bluetooth is now on and the device can be connected/discovered, USER MUST START THE SERVER SITE ON DEVICE BY 
      * CREATING NEW THREAD 
      */ 

      DeviceServer = new AcceptThread(); 

      /* 
      * Start the thread 
      */ 
      DeviceServer.start(); 

      /* 
      * Set the availability of the button 
      */ 

      bttn.setEnabled(false); 
      ((Button) this.findViewById(R.id.bt_server_stop)).setEnabled(true); 
     } 
    } 
    else if (bttn.getId() == R.id.bt_server_stop) 
    { 
     DeviceServer.cancel(); 
     bttn.setEnabled(false); 
     ((Button) this.findViewById(R.id.bt_server_start)).setEnabled(true); 
     BTDeviceName(); 
    } 

} 

Если вы действительно хотите, чтобы кнопка немедленно отключиться, когда пользователь выбирает «да», тогда вы должны попытаться запустить это намерение, используя startActivityForResult (disoverableIntent). Затем будет вызываться функция onActivityResult (вы можете переопределить ее в своей деятельности), и вы сможете увидеть здесь, если пользователь принял обнаружение или нет. Таким образом, вы получите что-то вроде:

@override 
protected void onActivityResult(int code, int result, Intent intent) 
{ 
    if(result == 1) // Here i'm not sure how to check that the user accepted the discoverability 
    /* 
    * As the bluetooth is now on and the device can be connected/discovered, USER MUST START THE SERVER SITE ON DEVICE BY 
    * CREATING NEW THREAD 
    */ 

     DeviceServer = new AcceptThread(); 

     /* 
     * Start the thread 
     */ 
     DeviceServer.start(); 

     /* 
     * Set the availability of the button 
     */ 

     bttn.setEnabled(false); 
     ((Button) this.findViewById(R.id.bt_server_stop)).setEnabled(true); 
} 
Смежные вопросы