WiFiとBuletoothを簡単に有効にする
|Androidの電源管理ウィジェットのように無線LANやBluetoothの有効・無効を切り替える方法を紹介します。
無線LAN、WifiManagerについてはWiFiの情報を取得するでSSIDの取得方法など情報取得の方法を解説しています。。ソースコードはGoogleCodeのこちらのリポジトリより取得できます。
それぞれのデバイスの制御方法は以下の通りです
- 無線LAN:WifiManager
- Bluetooth:BluetoothAdapter
無線LANはセンサー類と同様にContext#getSystemService(WIFI_SERVICE);でManagerを取得して切り替えることが可能です。Bluetoothは無線LANとは異なり、BluetoothAdapter#getDefaultAdapter();によりデバイスの有無を確認できます(nullが返却されればBluetoothはサポートされていない)。
![]() |
![]() |
電源管理ウィジェット(標準) | トグルボタンによる有効・無効制御 |
補足:AIRPLANE MODE
また、調査のなかで、3G通信など全ての通信をOFFにする「AIRPLANE MODE」への変更方法も見つけましたが、Android DevelopersのReferenceによると、Systemによる利用を前提としてprotected な intentであり、ユーザによる任意の切り替えは推奨されていません。
Intent.ACTION_AIRPLANE_MODE_CHANGED
1 2 3 | Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra( "state" , true ); sendBroadcast(intent); |
上記Intentをブロードキャストすることでエアプレーンモードに移行できます(システム利用が前提でユーザ利用は非推奨)。
Bluetooth/無線LANの切り替えサンプル・ソースコードは続きから
Bluetoothを切り替える
Bluetoothの状態取得・変更にはパーミッションが必要です。
AndroidManifest.xml
1 2 3 4 5 6 7 8 | <? xml version = "1.0" encoding = "utf-8" ?> package = "org.jpn.techbooster.sample.toggleDeviceActivity" android:versionCode = "1" android:versionName = "1.0" > < uses-permission android:name = "android.permission.BLUETOOTH" ></ uses-permission > < uses-permission android:name = "android.permission.BLUETOOTH_ADMIN" ></ uses-permission > …省略… |
Bluetoothの状態取得・変更のためBLUETOOTHとBLUETOOTH_ADMINを設定します。
android.permission.BLUETOOTHが状態取得のためのパーミッションで、BLUETOOTH_ADMINは状態の変更、有効・無効切り替え、設定のためのパーミッションです
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //toggleボタンにBluetoothの現在の有効/無効を反映 tb = (ToggleButton) findViewById(R.id.ToggleButtonBluetooth); BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter(); tb.setChecked(ba.isEnabled()); //ToggleのCheckが変更したタイミングで呼び出し tb.setOnCheckedChangeListener( new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { //トグルキーが変更された際に呼び出される Log.d( "ToggleButton" , "call Bluetooth OnCheckdChangeListener" ); //BT有効、無効切り替え BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter(); if (isChecked){ ba.enable(); // enable/disableの強制指定ではなく、ユーザにダイアログ表示して選択させる実装が望ましい // Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); // startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } else { ba.disable(); } } }); |
サンプルコードでは、トグルボタンでBluetoothの有効無効を切り替えています。今回利用したBluetoothAdapterのメソッドは以下の通りです。
- BluetoothAdapter#getDefaultAdapter(); :アダプタの取得
- BluetoothAdapter#isEnabled(); :状態確認(Boolean)
- BluetoothAdapter#enable(); :BTの有効化
- BluetoothAdapter#disable(); :BTの無効化
BTデバイス有効・無効切り替え時の注意
Bluetoothの切り替えは、通常のアプリケーションであれば上記のサンプル16~18行目のように実装します。
Androidで推奨される切り替え方は、intentを用いて、ユーザにダイアログ確認する方法です。
1 2 3 | //enable/disableの強制指定ではなく、ユーザにダイアログ表示して選択させる実装が望ましい Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); |
enable/disableの切り替えではユーザはハードウェアの有効化に気づきにくく、バッテリやユーザビリティに影響がでる可能性が高いためです。デバイスの状態を変更する際は、
- ダイアログ表示などでユーザに十分に注意を促す
- ウィジェットのように(デバイスが有効化/無効化されるといった)動作が十分予測できるアプリケーションでのみダイアログなしで状態を変更する
などユーザビリティに配慮する必要があります。
無線LANを切り替える
無線LANの状態取得・変更にはパーミッションが必要です。
AndroidManifest.xml
1 2 3 4 5 6 7 8 | <? xml version = "1.0" encoding = "utf-8" ?> package = "org.jpn.techbooster.sample.toggleDeviceActivity" android:versionCode = "1" android:versionName = "1.0" > < uses-permission android:name = "android.permission.CHANGE_WIFI_STATE" ></ uses-permission > < uses-permission android:name = "android.permission.ACCESS_WIFI_STATE" ></ uses-permission > …省略… |
パーミッションにCHANGE_WIFI_STATEおよびACCESS_WIFI_STATEを設定します。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //toggleボタンにwifiの現在の有効/無効を反映 ToggleButton tb = (ToggleButton) findViewById(R.id.ToggleButtonWifi); WifiManager wifi = (WifiManager) getSystemService(WIFI_SERVICE); tb.setChecked( wifi.isWifiEnabled() ); //ToggleのCheckが変更したタイミングで呼び出し tb.setOnCheckedChangeListener( new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { //トグルキーが変更された際に呼び出される Log.d( "ToggleButton" , "call Wifi OnCheckdChangeListener" ); //Wifi有効、無効切り替え WifiManager wifi = (WifiManager) getSystemService(WIFI_SERVICE); wifi.setWifiEnabled(isChecked); } }); |
3行目、Context#getSystemServiceメソッドでWifiManagerを取得します。
今回、利用するWifiManagerのメソッドは以下の通りです。
- WifiManager#isWifiEnabled() :Wifi状態確認
- WifiManager#setWifiEnabled() :Wifi切り替え
ToggleButtonのON/OFF制御が切り替わるタイミング(onCheckedChanged)でWifiも同時に有効、無効を切り替えています。
レイアウトファイル
レイアウトファイルは以下の通りです。Wifi/Bluetoothのトグルボタン部分のみ抜き出しています。
main.xml
1 2 3 4 5 6 7 8 9 10 11 | < LinearLayout android:id = "@+id/LinearLayout01" android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:orientation = "horizontal" android:gravity = "center" > < ToggleButton android:textOn = "Wifi On" android:textOff = "Wifi Off" android:id = "@+id/ToggleButtonWifi" android:layout_width = "wrap_content" android:layout_height = "wrap_content" ></ ToggleButton > < ToggleButton android:textOn = "BlueTooth On" android:textOff = "BlueTooth Off" android:id = "@+id/ToggleButtonBluetooth" android:layout_width = "wrap_content" android:layout_height = "wrap_content" ></ ToggleButton > </ LinearLayout > |