質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

6000閲覧

周囲のwifiを定期的にスキャンするプログラムをつくりたい

toukibi

総合スコア27

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2015/10/16 10:57

androidで周囲のアクセスポイントをスキャンするプログラムを作ったのですが、スキャンが起動時のみとなってしまいます。定期的にプログラムを呼び出して移動した場所でもスキャンできるようにしたいです。TimerTaskクラスを使えば良いのかと思ったのですがどうもうまくいきません。どうかご教授のほどよろしくお願いします。

下記のプログラムを定期的に呼び出せるようにしたいです。

public class WifiManager04 extends ListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

WifiManager manager = (WifiManager)getSystemService(WIFI_SERVICE); if(manager.getWifiState() == WifiManager.WIFI_STATE_ENABLED) { // APをスキャン manager.startScan(); // スキャン結果を取得 List<ScanResult> apList = manager.getScanResults(); String[] aps = new String[apList.size()]; for(int i=0; i<apList.size(); i++) { aps[i] = "SSID:" + apList.get(i).SSID + "\n" + apList.get(i).frequency + "MHz " + apList.get(i).level + "dBm"; } ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, aps); setListAdapter(adapter); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sho_cs

2015/10/16 12:01

TimerTaskクラスを使った場合、うまく行かないとのことですが具体的にどううまくいかないのですか? TimerTaskクラスを使った場合のコードも記載してください。
guest

回答1

0

ベストアンサー

スキャンが起動時のみとなってしまいます。定期的にプログラムを呼び出して移動した場所でもスキャンできるようにしたいです。TimerTaskクラスを使えば良いのかと思ったのですがどうもうまくいきません。

その通りで,TimerTaskを用いると実現可能です.習うより慣れろです.とりあえず使ってみて,どんなエラーが出て,上手くいかないのかを質問された方が,より深い理解を得られるでしょう.

10秒ごとにスキャンを行うように書き変えたものをのせます.
十分にコメントを載せたつもりですが,疑問点は返信ください.

Java

1public class WifiManager04 extends ListActivity { 2 /** Called when the activity is first created. */ 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}

投稿2015/10/16 12:00

編集2015/10/16 12:07
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toukibi

2015/10/16 16:17

非常に丁寧な対応本当にありがとうございます。 上記のものを入力しました。 エラー :(30, 33) エラー: Handlerはabstractです。インスタンスを生成することはできません エラー :(50, 28) エラー: シンボルを見つけられません シンボル: メソッド post(<anonymous Runnable>) 場所: タイプHandlerの変数 handler このようなエラーが出たのですがどこを修正すればよいのでしょうか?
退会済みユーザー

退会済みユーザー

2015/10/16 16:23

import文が間違っています. Handlerのimport文がimport java.util.logging.Handler;になっていませんか. 正しいimport文はimport android.os.Handler;です. 一応私のimport全文を載せておきます import android.app.ListActivity; import android.net.wifi.ScanResult; import android.net.wifi.WifiManager; import android.os.Handler; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.Toast; import java.util.List; import java.util.Timer; import java.util.TimerTask;
toukibi

2015/10/16 16:46

すみません、単なるimport分の不足でした しっかり動作しているようです本当にありがとうございました!
退会済みユーザー

退会済みユーザー

2015/10/16 16:50

よかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問