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
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", true); sendBroadcast(intent);
上記Intentをブロードキャストすることでエアプレーンモードに移行できます(システム利用が前提でユーザ利用は非推奨)。
Bluetooth/無線LANの切り替えサンプル・ソースコードは続きから
Bluetoothを切り替える
Bluetoothの状態取得・変更にはパーミッションが必要です。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" 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は状態の変更、有効・無効切り替え、設定のためのパーミッションです
サンプルコード
//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を用いて、ユーザにダイアログ確認する方法です。
//enable/disableの強制指定ではなく、ユーザにダイアログ表示して選択させる実装が望ましい Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
enable/disableの切り替えではユーザはハードウェアの有効化に気づきにくく、バッテリやユーザビリティに影響がでる可能性が高いためです。デバイスの状態を変更する際は、
- ダイアログ表示などでユーザに十分に注意を促す
- ウィジェットのように(デバイスが有効化/無効化されるといった)動作が十分予測できるアプリケーションでのみダイアログなしで状態を変更する
などユーザビリティに配慮する必要があります。
無線LANを切り替える
無線LANの状態取得・変更にはパーミッションが必要です。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" 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を設定します。
ソースコード
//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
<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>