ICSでandroid.net.wifi.p2p パッケージが増えたので、少し調べてみました。 クラス
必要なパーミッションWiFiダイレクトでは、いくつかの情報が暗黙的Intentとして飛んできます。 そのため、BroadcastReceiverを使って適宜アクションを受信する必要があります。 受信するactionはWifiP2pManagerに定義されています。
その他WiFiダイレクトは全てのAndroid端末が搭載しているわけではないので、 AndroidManifest.xmlには<uses-feature> として以下を記述するといいよとのこと。
また、WiFiダイレクトは通常のWiFiと排他なので、端末がWiFiのAPに接続してしまうと、自動でOFFられてしまいます。 アプリ起動中はWiFiに繋がないようですが、一方がアプリ起動してなかったりするとOFFられてたりするので注意が必要です。 初期化ActivityのonCreat()あたりで、以下のように呼び出します。 mP2PManager = (WifiP2pManager) getSystemService(WIFI_P2P_SERVICE);
mChannel = mP2PManager.initialize(this, getMainLooper(), null);WiFiダイレクトを利用するアプリでは、初めに初期化を呼び出す必要があります。
public WifiP2pManager.Channel initialize (Context srcContext, Looper srcLooper, WifiP2pManager.ChannelListener listener)Looperにはコールバックの返るスレッドを指定できます。基本UIスレッドへ返ってほしいと思うので、getMainLooper()でOKです。 渡したLooperが、Channelの持っているHandlerにバインドされるというだけです。 ChannelListenerは接続情報(切断時)のリスナーが用意されています。コールバックは、再初期化したい場合に利用できるようです。 特に必要なければnullで構いません。 Channelはアプリ終了までいろんなとこで使用するので、保持しておかないとイカンです。 レシーバーを動かす常駐したいならAndroidManifest.xmlにいつも通り定義してください。 ApplicationやActivityに結び付けたいのであれば、以下のようにして起動させます。
止めるときは
付近の端末を検索する近くにある端末の検索を開始します。 discoverPeers() で発見される端末は、WiFiダイレクトがONになっている端末です。 このメソッドは結果を返さず、渡したチャンネルについて検索を開始するだけです。 ActionListenerには、onSuccess() と onFailure() の2つが定義されていて、実行の成否が返ります。(後者の場合はエラーコードのようであまり役立たない何かが返ってきます。) 検索結果はメソッドが返さないので、BroadcastReceiverで受信する必要があります。 WIFI_P2P_PEERS_CHANGED_ACTION を受信して、以下のように処理できます。 public class HogeReceiver extends BroadcastReceiver {なかなか遠回りになりますが、こんな感じです。 実際はレシーバーだけで処理しないで、Activityなどにコールバックを実装して、そっちでrequestPeers() 以降の処理をしてあげるのがいいと思います。 WifiP2pDeviceListにはgetDeviceList() メソッドのみが定義されていて、WifiP2pDeviceのコレクションが取得できるようになっています。 端末に接続する端末に接続する方法です。 WifiP2pDeviceインスタンスを持っていなくても、WiFiダイレクトがONになっている端末のMacアドレスがわかっていれば接続できるようです。(距離次第ですが
WifiP2pDeviceListから直接取得しちゃってますが、ユーザーに選択させる場合はListViewなりを活用してください。 例によって、ActionListenerはnullでも問題ありません。 成否のコールバックがありますが、この時点では接続できていないことに注意してください。 実際に接続が完了したことは、BroadcastReceiverのWIFI_P2P_CONNECTION_CHANGED_ACTION で受信できます。 接続が確立されるまでの間、端末同士はINVITEという状態になります。
public void connect (WifiP2pManager.Channel c, WifiP2pConfig config, WifiP2pManager.ActionListener listener)接続時に重要なのが、2番目のWifiP2pConfigです。 この引数は、どの端末へ、どういった接続方法を取るかを指定できます。 といっても、Macアドレスさえ指定してやれば接続できます。 WifiP2pConfigの変数wps.setup では、接続時に相手にどういった通知がされるかを選択できます。
相手端末がどのWPSに対応しているかは、WifiP2pDeviceのパラメータとしてあらかじめ確認できます。 なぜか、WIFI_P2P_THIS_DEVICE_CHANGED_ACTION で取得できる自分の端末情報には記載されません。(falseになる) 相手から見るとtrueになるので、そういう仕様っぽいです。 WiFiダイレクトで接続すると、グループというものが生成されますが、このグループのオーナーは自動的に決まるようです。 createGroup() でグループ作れんのかな?と思ったけど、そこに参加できませんでした。ようわかりません(´・ω:;.:... 切断する端末間の接続をやめる場合、端末の状態によって呼び出すメソッドが変わります。 状態というのは、WifiP2pDeviceのstatusのことです。 CONNECTED INVITED 引数は同じです。 端末間の接続が確立された場合は、removeGroup() を呼び出すと切断処理が開始されます。 即座に切断されるわけではなく、WIFI_P2P_CONNECTION_CHANGED_ACTION の通知が飛んできます。 INVITEDの場合はまだ接続参加処理中なので、中止してくれるようにします。 たまに、要請元がINVITEDになるけど、要請先が反応なくてハマることがあったりするのがよくわからんです(´・ω・`) その場合は落ち着いてWiFiダイレクトをOFFってやればいいと思います。 ここまでが接続~切断までの流れです。 次があれば接続してからの処理について書くと思います。 |



