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

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

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

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

Android

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

Android Studio

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

Kotlin

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

Q&A

解決済

1回答

2243閲覧

android studioでkotlinでのCSV出力について

tomo01

総合スコア13

Java

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

Android

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

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2019/01/06 06:20

編集2019/01/07 14:10

前提・実現したいこと

android studio で現在、こちらのサイト
https://qiita.com/seaka829/items/613d27035dab7b3a9121 から
ibeaconからmajor、minor、RSSIを取得するアプリを作ったのですが、
取得したデータを保存する方法が分からなくて困っています。

作りたいと思っているものが、
時間ごと(1秒ごととか)に、取得したデータと日付を
自動でフォルダに保存するアプリです。

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

https://teratail.com/questions/25005
この質問を参考にまずは僕も保存する仕組みを理解しようと
csvファイルを出力するものを作ったのですが、
アプリが繰り返し停止して起動しません。
もちろん、ファイルも作られていませんでした。

========================================
ここから追記

サンプルのファイルを作ることができたので
今度はここに取得したデータを入れたのですが、
最初に検知したデータしか入りません。
for文で繰り返せばよいのでしょうか?

該当のソースコード

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] Log.d("Test_Major", maxMajor.toString()) Log.d("Test_Minor", maxMinor.toString()) Log.d("test_rssi", maxrssi.toString()) //パスの指定 val fw = FileWriter(Environment.getExternalStorageDirectory().getPath() + "/test.csv") //バッファリングによって文字列を効率的に書き込む val pw = PrintWriter(BufferedWriter(fw)) //内容を指定する pw.print("MAJOR") pw.print(",") pw.print("MINOR") pw.print(",") pw.print("RSSI") pw.println() 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" } }

###試したこと
READ_EXTERNAL_STORAGE権限も与えました。

================================
CSVで保存ができましたが、一番最初に検知した
major,minor,rssiのみ保存されていました。

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

android studio 3.2.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

このプログラムではcheckSelfPermission()による権限の確認やrequestPermissions()による権限の取得を行っていますが、ストレージへの書き込みも同様に権限が必要になります。この辺りが参考になると思います。

[Android] 外部ストレージにファイルを保存する WRITE_EXTERNAL_STORAGE

投稿2019/01/06 10:08

keicha_hrs

総合スコア6768

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

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

keicha_hrs

2019/01/06 10:14

あ。ご提示のコードはinit {} の中にファイル書き込み記述をされていますが(テスト的書き込みのため?)、権限の問題を解決しても、この方法では書き込みはできませんね。checkPermission()以降で処理を行う必要があります。
tomo01

2019/01/06 10:48

ありがとうございます! アプリの権限の設定をして、テストCSVファイルの出力ができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問