X

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

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>
mhidaka: Software Engineerだよ。DroidKaigi Organizer / Androidと組込とRe:VIEW。techbooster主宰。mhidaka's writings http://booklog.jp/users/mhidaka 技術書典! http://techbookfest.org