簡易的なwifiのon/offウィジェットを作成する

appWidgetで何か作りたくて。。

wifiの切り替えウィジェットなんてmarketを探せば腐るほどあるけど、どれを選んでいいのかわからない(それを調べるのも面倒)ので、実装してみた。

WifiService.java

package com.android.hoge.mannerswitcher;

import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Intent;
import android.net.wifi.WifiManager;
import android.os.IBinder;
import android.util.Log;
import android.widget.RemoteViews;

public class WiFiService extends Service {

	private static final String WIFI_SWITCH_CLICK = "com.android.hoge.wifiswitcher.WiFiService.WIFI_SWITCH_CLICK";

	@Override
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		Log.d("Wifi-Switcher","WiFiService::onStart");

		/**
		 * サービス起動元の情報を取得
		 */
		String activator = intent.getStringExtra("ServiceActivatorName");
		Log.d("Wifi-Switcher","WiFiService::activator=" + activator);

		/**
		 * ウィジェットのレイアウト情報をリモートビューに設定
		 */
		RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout.widget);
		this.setRemoteViews(remoteViews);

		/**
		 * Wi-Fiの切替機能実装
		 */
		WifiManager wifi = (WifiManager)getSystemService(WIFI_SERVICE);
		if(wifi.isWifiEnabled()) {
			Log.d("Wifi-Switcher","NowWiFiStatus -----ON-----");
			/**
			 * WifiをOnからOffに
			 */
			wifi.setWifiEnabled(false);
			remoteViews.setImageViewResource(R.id.switch_btn, R.drawable.wifi_off);
		}
		else {
			Log.d("Wifi-Switcher","NowWiFiStatus -----OFF-----");
			/**
			 * WifiをOffからOnに
			 */
			wifi.setWifiEnabled(true);
			remoteViews.setImageViewResource(R.id.switch_btn, R.drawable.wifi_on);
		}

		/**
		 * ウィジェットの更新
		 */
		this.updateWidget(remoteViews);
	}

	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}

	/**
	 * RemoteViewsオブジェクトのセットアップを実施
	 *
	 * @param remoteViews
	 */
	public void setRemoteViews(RemoteViews remoteViews) {
		Intent intent = new Intent(WIFI_SWITCH_CLICK);
		PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, 0);
		remoteViews.setOnClickPendingIntent(R.id.switch_trigger, pendingIntent);
	}

	/**
	 * ウィジェットの更新処理を実行します。
	 *
	 * @param remoteViews
	 */
	private void updateWidget(RemoteViews remoteViews) {
		ComponentName thisWidget = new ComponentName(this, WidgetActivity.class);
		AppWidgetManager manager = AppWidgetManager.getInstance(this);
		manager.updateAppWidget(thisWidget, remoteViews);
	}
}

これをウィジェット側のonUpdateでstartServiceすればok。
AndroidManifestの記述も忘れずに。

実装はとりあえずwifiを切り替えるだけ。(最終的にはSSIDのリストからwifiを選択できるようにしたい)

widgetの実装はちょっと調べればできるぐらい簡単でした。

※ちなみにエミュレータではWi-Fiをサポートしていないようです。