前提・実現したいこと
android studio で現在、こちらのサイト
https://qiita.com/seaka829/items/613d27035dab7b3a9121
からibeaconからmajor、minor、RSSIを取得するアプリを作ったのですが、
取得したデータを保存する方法が分からなくて困っています。
作りたいと思っているものが、
時間ごと(1秒ごととか)に、取得したデータと日付を
自動でフォルダに保存するアプリです。
発生している問題・エラーメッセージ
CSVファイルは作られたのですが、
最初に検知したデータしか入りません。
for文の位置が悪いのでしょうか?
該当のソースコード
package com.websarva.wings.android.beacon_kotlin import android.annotation.SuppressLint import android.content.Context import android.content.pm.PackageManager import android.os.* import android.support.v7.app.AppCompatActivity import android.support.annotation.RequiresApi import android.support.v4.app.INotificationSideChannel import android.util.Log import android.view.View import android.widget.TextView import android.widget.Toast import kotlinx.android.synthetic.main.activity_main.* import org.altbeacon.beacon.* import java.io.BufferedWriter import java.io.FileWriter import java.io.IOException import java.io.PrintWriter import java.util.* class MainActivity : AppCompatActivity(), BeaconConsumer { // BeaconManager型変数の宣言 private var beaconManager: BeaconManager? = null // uuidの指定 private val uuidString: String = "48534442-4C45-4144-80C0-180000000000" private val uuid = Identifier.parse(uuidString) // ビーコンのフォーマット設定 private val IBEACON_FORMAT: String = "m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24" private val handler: Handler = Handler() /************************************************** * AppCompatActivity内のメソッドをoverride **************************************************/ // onCreate @RequiresApi(Build.VERSION_CODES.ECLAIR) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // デバイスのBLE対応チェック if (!packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { // 未対応の場合、Toast表示 showToast("このデバイスはBLE未対応です", Toast.LENGTH_LONG) } // API 23以上かのチェック if (Build.VERSION.SDK_INT >= 23) { // パーミッションの要求 checkPermission() } // ビーコンマネージャのインスタンスを生成 beaconManager = BeaconManager.getInstanceForApplication(this) // BeaconManagerの設定 beaconManager!!.beaconParsers.add(BeaconParser().setBeaconLayout(IBEACON_FORMAT)) } // onResume override fun onResume() { super.onResume() // ビーコンサービスの開始 beaconManager!!.bind(this) } // onPause override fun onPause() { super.onPause() // ビーコンサービスの停止 beaconManager!!.unbind(this) } /************************************************** * BeaconConsumer内のメソッドをoverride **************************************************/ // onBeaconServiceConnect override fun onBeaconServiceConnect() { try { // ビーコン情報の監視を開始、第3,4引数はmajor・minor値を指定する時に使用 beaconManager!!.startMonitoringBeaconsInRegion(Region("48534442-4C45-4144-80C0-180000000000", uuid, null, null)) } catch (e: RemoteException) { e.printStackTrace() } // モニタリングの通知受取り処理 beaconManager!!.addMonitorNotifier(object : MonitorNotifier { // 領域内に侵入した時に呼ばれる override fun didEnterRegion(region: Region) { // レンジングの開始 beaconManager!!.startRangingBeaconsInRegion(region) } // 領域外に退出した時に呼ばれる override fun didExitRegion(region: Region) { // レンジングの停止 beaconManager!!.stopRangingBeaconsInRegion(region) } // 領域への侵入/退出のステータスが変化した時に呼ばれる override fun didDetermineStateForRegion(i: Int, region: Region) { // } }) // レンジングの通知受け取り処理 beaconManager!!.addRangeNotifier(object : RangeNotifier { // 範囲内のビーコン情報を受け取る override fun didRangeBeaconsInRegion(beacons: Collection<Beacon>, region: Region) { var maxMajor: Int? var maxMinor: Int? var maxrssi: Int? // 範囲内の複数のビーコン情報を保持させる変数 var getMajorList: ArrayList<Int> = ArrayList() var getMinorList: ArrayList<Int> = ArrayList() var getRssiList: ArrayList<Int> = ArrayList() // 範囲内にビーコンがある時の処理 if (beacons.size > 0) { // 範囲内のビーコンの数だけ繰り返す for (beacon in beacons) { // 複数のビーコン情報をArrayListに分割 getMajorList.add(beacon.id2.toInt()) getMinorList.add(beacon.id3.toInt()) getRssiList.add(beacon.rssi.toInt()) } // RSSIが最も大きいインデックスを取得 var indexRssi: Int = getRssiList.indexOf(getRssiList.max()) // 取得したインデックスのmajor値・minor値を取得 maxMajor = getMajorList[indexRssi] maxMinor = getMinorList[indexRssi] maxrssi = getRssiList[indexRssi] //パスの指定 val fw = FileWriter(Environment.getExternalStorageDirectory().getPath() + "/test.csv") //バッファリングによって文字列を効率的に書き込む val pw = PrintWriter(BufferedWriter(fw)) //内容を指定する pw.print(",") pw.print("MAJOR") pw.print(",") pw.print("MINOR") pw.print(",") pw.print("RSSI") pw.println() for (i in 1..4) { Log.d("Test_Major", maxMajor.toString()) Log.d("Test_Minor", maxMinor.toString()) Log.d("test_rssi", maxrssi.toString()) print(i) pw.print(",") pw.print(maxMajor.toString()) pw.print(",") pw.print(maxMinor.toString()) pw.print(",") pw.print(maxrssi.toString()) pw.println() } //ファイルに書き出す pw.close() handler.post { viewUpdate(maxrssi, maxMajor, maxMinor) } } } }) } /************************************************** * メソッド **************************************************/ // トースト表示のメソッド fun showToast(text: String, length: Int) { // トーストの生成と表示 var toast: Toast = Toast.makeText(this, text, length) toast.show() } @RequiresApi(Build.VERSION_CODES.M) fun checkPermission() { // パーミッション未許可の時 if (checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // パーミッションの許可ダイアログの表示 requestPermissions(arrayOf(android.Manifest.permission.ACCESS_COARSE_LOCATION), 0) } } //一番RRSIが強いmajorとminorの表示と保存 fun viewUpdate(rssi: Int?, major: Int?, minor: Int?) { // Viewの取得 val rssiTextView: TextView = findViewById(R.id.rssi) as TextView val majorTextView: TextView = findViewById(R.id.major) as TextView val minorTextView: TextView = findViewById(R.id.minor) as TextView majorTextView.text = "major:" + major minorTextView.text = "minor:" + minor rssiTextView.text = "RSSI:" + rssi + "dBm" } }
試したこと
for文の位置を変えたりしましたがうまくいきません。
現在のプログラムですと、同じ値が4つ保存される状況です。
補足情報(FW/ツールのバージョンなど)
android studio 3.2.1

回答2件
あなたの回答
tips
プレビュー