いつもお世話になっております。
以前、似たような質問を上げましたが、質問の仕方が適切ではなかったので閉じた経緯がありました。
今回は自分なりに調べたりトライした上で質問させていただきますのでよろしくお願いします。
(ソース全てを貼り付けたら、文字数オーバーとなってしまいましたので、部分的にソースを割愛しています。)
【目的】付近にあるビーコンをアンドロイド端末で受信して、情報をログに出力する(強度の強い順にMAX3つのビーコン)。
【方法】端末画面にて、ドロップダウンリスト(1~25の番号表示)から1つ選択し、[START]ボタンをクリックすると受信開始し、
[STOP]ボタンクリックで受信を終了する。
【現状】アプリを起動と同時に電波受信開始、アプリ終了で受信終了。
ドロップダウンリストは表示&選択できる状態。ボタンは画面に配置したが、まだ機能はつけていない。
※ソースの下に、実現したいことを記載しています。
Kotlin
1package com.example.*****.myapplication 2import android.Manifest 3//***割愛します****// 4・ 5・ 6・ 7import org.altbeacon.beacon.* 8 9@Suppress("DEPRECATION") 10class MainActivity : AppCompatActivity() ,BeaconConsumer { 11 12 // BeaconManager型変数の宣言 13 private var beaconManager: BeaconManager? = null 14 15 // uuidの指定 16 private val uuidString = "FDA50693-A4E2-4FB1-AFCF-C6EB07647825" 17 private val uuid = Identifier.parse(uuidString) 18 19 // ビーコンのフォーマット設定 20 private val IBEACON_FORMAT: String = "m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24" 21 22 // Handlerクラスの変数の宣言(追加) 23 private val handler: Handler = Handler() 24 25 // 選択肢 26 private val spinnerItems = arrayOf("1", "2", "3", "4" , "5" ,"6" , "7" , "8", "9" , "10" , 27 "11" , "12" , "13" , "14", "15", "16", "17", "18", "19", "20", "21", "22","23","24","25") 28 29 /************************************************** 30 * AppCompatActivity内のメソッドをoverride 31 **************************************************/ 32 // onCreate 33 @SuppressLint("HardwareIds") 34 override fun onCreate(savedInstanceState: Bundle?) { 35 super.onCreate(savedInstanceState) 36 setContentView(R.layout.activity_main) 37 38 //-------------------------------------------------------------------------// 39 // ArrayAdapter 40 val adapter = ArrayAdapter(applicationContext, 41 android.R.layout.simple_spinner_item, spinnerItems) 42 43 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) 44 45 // spinner に adapter をセット 46 spinner.adapter = adapter 47 48 // リスナーを登録 49 spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{ 50 // アイテムが選択された時 51 override fun onItemSelected(parent: AdapterView<*>?, 52 view: View?, position: Int, id: Long) { 53 val spinnerParent = parent as Spinner 54 val item = spinnerParent.selectedItem as String 55 // Kotlin Android Extensions 56 textView.text = item 57 val fileName = "logfile" + item + ".txt" 58 Log.d("Rssi_===fileName===", "$fileName") 59 60 } 61 62 // アイテムが選択されなかった時 63 override fun onNothingSelected(parent: AdapterView<*>?) { 64 // 65 } 66 } 67 //-----------------------------------------------------------------------------// 68 // デバイスのBLE対応チェック 69 if (!packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { 70 71 // 未対応の場合、Toast表示 72 showToast("このデバイスはBLE未対応です", Toast.LENGTH_LONG) 73 } 74 75 // API 23以上かのチェック 76 if (Build.VERSION.SDK_INT >= 23) { 77 // パーミッションの要求 78 checkPermission() 79 } 80 // ビーコンマネージャのインスタンスを生成 81 beaconManager = BeaconManager.getInstanceForApplication(applicationContext) 82 83 // BeaconManagerの設定 84 beaconManager!!.beaconParsers.add(BeaconParser().setBeaconLayout(IBEACON_FORMAT)) 85 86 } 87 88 // onResume 89 override fun onResume() { 90 super.onResume() 91 92 // ビーコンサービスの開始 93 beaconManager!!.bind(this) 94 } 95 96 // onPause 97 override fun onPause() { 98 super.onPause() 99 100 // ビーコンサービスの停止 101 beaconManager!!.unbind(this) 102 } 103 104 override fun onBackPressed() { 105 // バックキーの無効化 106 moveTaskToBack (true) 107 } 108 109 110 /************************************************** 111 * BeaconConsumer内のメソッドをoverride 112 **************************************************/ 113 // onBeaconServiceConnect 114 override fun onBeaconServiceConnect() { 115 116 try { 117 // ビーコン情報の監視を開始、第3,4引数はmajor・minor値を指定する時に使用 118 beaconManager!!.startMonitoringBeaconsInRegion(Region("beacon-test", uuid, null, null )) 119 } catch (e: RemoteException) { 120 e.printStackTrace() 121 } 122 123 // モニタリングの通知受取り処理 124 beaconManager!!.addMonitorNotifier(object : MonitorNotifier { 125 126 // 領域内に侵入した時に呼ばれる 127 override fun didEnterRegion(region: Region) { 128 129 // レンジングの開始 130 beaconManager!!.startRangingBeaconsInRegion(region) 131 } 132 133 // 領域外に退出した時に呼ばれる 134 override fun didExitRegion(region: Region) { 135 136 // レンジングの停止 137 beaconManager!!.stopRangingBeaconsInRegion(region) 138 } 139 140 // 領域への侵入/退出のステータスが変化した時に呼ばれる 141 override fun didDetermineStateForRegion(i: Int, region: Region) { 142 // 143 } 144 }) 145 146 // レンジングの通知受け取り処理 147 beaconManager!!.addRangeNotifier { beacons, _ -> 148 149 // 範囲内のビーコン情報を受け取る 150 151 //***ここからしばらく処理のコードがありますが長いので割愛します****// 152 153 // 携帯端末固有ID 154 val deviceId = Settings.Secure.getString(this.getContentResolver(), Settings.System.ANDROID_ID); 155 Log.d("Rssi_0_Maj_Min_Dis_Rs", "$deviceId,$maxName0,$maxMajor0,$maxMinor0,$maxDistance0,$maxRssi0") 156 Log.d("Rssi_1_Maj_Min_Dis_Rs", "$deviceId,$maxName1,$maxMajor1,$maxMinor1,$maxDistance1,$maxRssi1") 157 Log.d("Rssi_2_Maj_Min_Dis_Rs", "$deviceId,$maxName2,$maxMajor2,$maxMinor2,$maxDistance2,$maxRssi2") 158 159 160 // メインスレッドで実装(追加) 161 handler.post { 162 // 空の引数を渡して、Viewの更新 163 //***割愛します****// 164 ) 165 } 166 167 // Viewの更新 168 viewUpdate( 169//***割愛します****// 170 ) 171 } 172 } 173 } 174 175 private fun viewUpdate( 176//***割愛します****// 177 178 ) 179 { 180 181 // Viewの取得 182//***割愛します****// 183 } 184 185 186 /************************************************** 187 * メソッド 188 **************************************************/ 189 // トースト表示のメソッド 190//***割愛します****// 191 192 // パーミッションの許可チェック 193//***割愛します****// 194} 195 196
【実現したいこと】
下記の順番で処理を実行させたい。
1.アプリ起動。
2.ドロップダウンリストにて選択。
3.[START]ボタンクリックで電波受信開始。
4.任意の時間、電波収集
5.[STOP]ボタンクリックで受信終了。
今は、アプリ起動と同時に電波受信が始まります。
実際そのようなコードになっているのだと思いますが、
上記2、3、5の処理をソース中のどこに入れたら良いのかがわかりません。
ボタンのリスナー(まだコードに書いていませんが)を、
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
の下に書いたりしましたが、異常終了してしまいました。
また、//----------------//で挟みましたが、
spinnerのリスナーの場所もそこが正しいのでしょうか。
以上になります。
長々とした質問となり申し訳ございません。
ご教示のほどよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー