2010年6月6日日曜日

AndroidのWifiのscanStartではまる

AndroidでWifiをScanするプログラムです。

package jp.ac.hoge.android.wifi;

import java.util.List;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class WifiActivity extends Activity implements OnClickListener {
private TextView tv_search_result;
private WifiManager wifi_mng;
private WifiReceiver wifi_rec;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn_start_search = (Button) findViewById(R.id.btn_start_search);
btn_start_search.setOnClickListener(this);
}

public void onClick(View v) {
// TODO 自動生成されたメソッド・スタブ
if (v.getId() == R.id.btn_start_search) {
tv_search_result = (TextView) findViewById(R.id.tv_search_result);
wifi_mng = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifi_rec = new WifiReceiver();
registerReceiver(wifi_rec, new IntentFilter(
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
wifi_mng.startScan();
tv_search_result.setText("スキャン開始\n");
}
}

class WifiReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
// TODO 自動生成されたメソッド・スタブ
StringBuffer sb = new StringBuffer();
List<ScanResult> result_list = wifi_mng.getScanResults();
for (int i = 0; i < result_list.size(); i++) {
sb.append(new Integer(i + 1).toString() + ".");
sb.append((result_list.get(i)).toString());
sb.append("\n");
}
tv_search_result.setText(sb);
}
}
}

このままだとstartScanで落ちてしまいます(もちろんエミュレータでは動かないのので実機Nexous Oneで)。
なので、AndroidManifext.xmlに

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>

の権限を追加します(BREWみたい)。Bluetoothも同じような権限があるみたいだけどまだ未調査。



研究室のデスク周りで6つAPが見つかりました。
SSIDにはアクセスポイント名、BSSIDにはMACアドレス、capabilitiesには暗号化などの方式が表示されます。

inSSIDerみたいなのもすぐできそう。すでにあるかも。

0 件のコメント: