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>
2 Comments