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

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

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

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

Android Wear

Android Wearとは、Googleが発表した腕時計型ウェアラブルデバイス(スマートウォッチ)向けのプラットフォームです。GoogleのAndroid OSをベースにしており、情報の入手・管理などを行うことができます。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Android Emulator

Android EmulatorはアンドロイドのOSで起動しているアンドロイドのデバイスの機能をシミュレートするソフトウェアです。Emulatorは開発者に複数の違う設定を持ったデバイスを必要とすることなくアプリケーションを開発しテストすることが可能になります。

Q&A

1回答

1626閲覧

WearOSのFragmentActivity上でWifiスキャンを行いたい

EnderMan

総合スコア7

Android

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

Android Wear

Android Wearとは、Googleが発表した腕時計型ウェアラブルデバイス(スマートウォッチ)向けのプラットフォームです。GoogleのAndroid OSをベースにしており、情報の入手・管理などを行うことができます。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Android Emulator

Android EmulatorはアンドロイドのOSで起動しているアンドロイドのデバイスの機能をシミュレートするソフトウェアです。Emulatorは開発者に複数の違う設定を持ったデバイスを必要とすることなくアプリケーションを開発しテストすることが可能になります。

0グッド

0クリップ

投稿2019/08/28 06:22

前提・実現したいこと

Wear OS 向けにスタンドアロンアプリを作成しようとしています。
fragmentを表示した際にWifiScanを実施しスキャン結果(SSID情報と暗号化形式)を指定のArrayListに格納したいです。
とりあえず今回提示しているコードではLogcatにBSSID情報を出力することでコードの動作確認と考えています。

発生している問題・エラーメッセージ

エラーの発生は無し。
下記に記述するコードを実行した際にbroadcastReceiverが実行されていないことが問題と考えていますがなぜ実行されないかが判りません。

logcat

1019-08-22 20:42:58.286 20362-20362/com.example.myapplicationtest D/listen: BlankFragment2|Wake setUserVisibleHint|false 22019-08-22 20:43:04.115 20362-20362/com.example.myapplicationtest D/listen: BlankFragment2|Wake setUserVisibleHint|true 32019-08-22 20:43:04.125 20362-20362/com.example.myapplicationtest D/listen: BlankFragment2|View Toast & set Wifi 42019-08-22 20:43:04.128 20362-20362/com.example.myapplicationtest D/listen: BlankFragment2|View Toast & called registerReceiver 52019-08-22 20:43:04.128 20362-20362/com.example.myapplicationtest D/listen: BlankFragment2|unregisterReceiver(broadcastReceiver)

setUserVisibleHintはPagerでFragmentが表示されたときにtrueになります。
上記のLogからunregisterまで動作が流れていることがわかりonReceive Calledも表示されていなければなりません。

該当のソースコード

BlankFragment2.kt

Kotlin

1package com.example.myapplicationtest 2 3import android.content.BroadcastReceiver 4import android.content.Context 5import android.content.Intent 6import android.content.IntentFilter 7import android.net.wifi.ScanResult 8import android.net.wifi.WifiManager 9import android.os.Bundle 10import android.util.Log 11import androidx.fragment.app.Fragment 12import android.view.LayoutInflater 13import android.view.View 14import android.view.ViewGroup 15import android.widget.Toast 16 17class BlankFragment2 : Fragment() { 18 lateinit var wifiManager : WifiManager 19 var resultList = ArrayList<ScanResult>() 20 val broadcastReceiver = object : BroadcastReceiver() { 21 override fun onReceive(contxt: Context?, intent: Intent?) { 22 resultList = wifiManager.scanResults as ArrayList<ScanResult> 23 Log.d("listen", "onReceive Called") 24 } 25 } 26 override fun setUserVisibleHint(isVisibleToUser: Boolean) { 27 super.setUserVisibleHint(isVisibleToUser) 28 Log.d("listen", this::class.java.simpleName + "|" + "Wake setUserVisibleHint" + "|" +isVisibleToUser ) 29 30 if (isVisibleToUser == true) { 31 wifiManager = this.activity?.getSystemService(Context.WIFI_SERVICE) as WifiManager 32 scanWifi() 33 } 34 } 35 private fun scanWifi() { 36 if (!wifiManager.isWifiEnabled()) { 37 Toast.makeText(activity,"WiFi is disabled ... We need to enable it", Toast.LENGTH_LONG).show() 38 wifiManager.setWifiEnabled(true) 39 wifiManager.startScan() 40 Log.d("listen", this::class.java.simpleName + "|" + "View Toast & set Wifi") 41 } 42 activity?.registerReceiver(broadcastReceiver, IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) 43 Toast.makeText(activity, "Scanning WiFi ...", Toast.LENGTH_SHORT).show() 44 Log.d("listen", this::class.java.simpleName + "|" + "View Toast & called registerReceiver") 45 for (scanResult in resultList){ 46 Log.d("Wifi", scanResult.BSSID.toString()) 47 } 48 activity?.unregisterReceiver(broadcastReceiver) 49 Log.d("listen", this::class.java.simpleName + "|" + "unregisterReceiver(broadcastReceiver)") 50 } 51 override fun onCreateView( 52 inflater: LayoutInflater, container: ViewGroup?, 53 savedInstanceState: Bundle? 54 ): View? { 55 // Inflate the layout for this fragment 56 return inflater.inflate(R.layout.fragment_blank_fragment2, container, false) 57 } 58} 59

試したこと

パーミッションについては許可を取得済みです。
(実行環境がエミュレータの場合Wifiをサポートしていないため本動作の確認は実機環境で実行しています。)

WifiScanをFragment上で行う例は検索しても少なく知恵を授けていただけると幸いです。

補足情報(FW/ツールのバージョンなど)

テスト環境:Wear OS Round Chin API 26 Resolution 300*320:hdpi
ビルド環境: Android Gradle Plugin Version 3.5.0 Gradle Version 5.5.1

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

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

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

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

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

guest

回答1

0

BroadcastReceiverのonReceiveメソッドは、registerReceiverで登録した直後に呼ばれることは保証されていないと思います。ご提示のコードではregisterReceiverの直後にunregisterReceiverを実行していますから、onReceiveが呼ばれる前に登録が解除されているのでしょう。

onReceiveが呼ばれるのを待ってから、目的の処理やunregisterReceiverを実行するようにしてみてください。また、その際はメモリリークを防ぐためにunregisterReceiverを適切なタイミングで呼ぶのを忘れないようにしてください。

投稿2019/09/07 01:23

編集2019/09/07 01:27
kakajika

総合スコア3131

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

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

EnderMan

2019/09/07 01:32

回答ありがとうございます。 非同期実行ではないので問題ないかとも思ったのですが…… 試しにunregister無しで実行してみましたが呼ばれることはありませんでした。
kakajika

2019/09/07 01:43

startScanの前にregisterReceiverしても呼ばれませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問