前提・実現したいこと
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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/07 01:32
2019/09/07 01:43