スキャンが起動時のみとなってしまいます。定期的にプログラムを呼び出して移動した場所でもスキャンできるようにしたいです。TimerTaskクラスを使えば良いのかと思ったのですがどうもうまくいきません。
その通りで,TimerTaskを用いると実現可能です.習うより慣れろです.とりあえず使ってみて,どんなエラーが出て,上手くいかないのかを質問された方が,より深い理解を得られるでしょう.
10秒ごとにスキャンを行うように書き変えたものをのせます.
十分にコメントを載せたつもりですが,疑問点は返信ください.
Java
1 public class WifiManager04 extends ListActivity {
2
3 @Override
4 public void onCreate ( Bundle savedInstanceState ) {
5 super . onCreate ( savedInstanceState ) ;
6
7 /* Scan 毎に Adapter, WifiManager を生成するのは無駄なので 生成は1度だけにします */
8 final ArrayAdapter < String > adapter = new ArrayAdapter < > ( this , android . R . layout . simple_list_item_1 ) ;
9 setListAdapter ( adapter ) ;
10
11 final WifiManager manager = ( WifiManager ) getSystemService ( WIFI_SERVICE ) ;
12
13 /* メインスレッド以外から UI を触るための 仲介役です */
14 final Handler handler = new Handler ( ) ;
15
16 /* 一定時間ごとに 実行してほしいことを run() の中に書きます */
17 final TimerTask timerTask = new TimerTask ( ) {
18 @Override
19 public void run ( ) {
20 /* 今回やることは AP のスキャンです */
21 if ( manager . getWifiState ( ) == WifiManager . WIFI_STATE_ENABLED ) {
22 // APをスキャン
23 manager . startScan ( ) ;
24 // スキャン結果を取得
25 List < ScanResult > apList = manager . getScanResults ( ) ;
26 final String [ ] aps = new String [ apList . size ( ) ] ;
27 for ( int i = 0 ; i < apList . size ( ) ; i ++ ) {
28 aps [ i ] = "SSID:" + apList . get ( i ) . SSID + "\n"
29 + apList . get ( i ) . frequency + "MHz " + apList . get ( i ) . level + "dBm" ;
30 }
31
32 /* スキャンが終わったら表示してあげましょう */
33 /* TimerTask は メインスレッドで実行できませんが UIを触りたいのでHandlerを使います */
34 handler . post ( new Runnable ( ) {
35 @Override
36 public void run ( ) {
37 /* リストをきれいさっぱり空にして */
38 adapter . clear ( ) ;
39 /* 新しい情報を全部足して */
40 adapter . addAll ( aps ) ;
41 /* 中身変わったからねって教える */
42 adapter . notifyDataSetChanged ( ) ;
43 /* テスト用の Toast です */
44 /* このプログラムでは 10秒ごとに 表示されれば 正常に動作しています */
45 Toast . makeText ( WifiManager04 . this , "datasetChanged" , Toast . LENGTH_SHORT ) . show ( ) ;
46 }
47 } ) ;
48 }
49 }
50 } ;
51
52 /* やることを書き終えたので 実行してあげましょう */
53 /* 前述の通り TimerTaskは UI スレッドで実行できないので 別なスレッドの中で実行します */
54 new Thread ( new Runnable ( ) {
55 @Override
56 public void run ( ) {
57 /* new Timer の引数 true は 管理を簡単にするおまじないです */
58 /* アプリが終了処理に入っても 絶対に中断されたくない処理は false にします*/
59 /* 1回目を 0秒後(直後)から 10000ミリ秒(10秒)間隔で実行する */
60 new Timer ( true ) . schedule ( timerTask , 0 , 10000 ) ;
61 }
62 } ) . start ( ) ;
63 }
64 }