Android App中用Kotlin保存Beacon距离到TXT文件的问题及优化需求
问题解决指南
1. 固定文件路径到易访问的公共目录
默认的getExternalFilesDir(null)指向应用私有外部存储(Android/data/你的应用包名/files),普通用户很难定位。可以将文件写入系统公共的Download目录,直接在文件管理器的Download文件夹就能找到目标文件。
代码修改:
首先确保权限配置:
- Android 6.0~9.0:需在
AndroidManifest.xml声明WRITE_EXTERNAL_STORAGE权限,并动态申请。 - Android 10+:可通过
MediaStore写入,或声明MANAGE_EXTERNAL_STORAGE权限(适合数据分析场景)。
修改写入函数:
private fun writeToFile(content: String) { Log.d(TAG, "trying to write to file") // 获取公共Download目录 val downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) val file = File(downloadDir, "beacon_distance.txt") try { // 追加内容,指定UTF-8编码避免乱码 file.appendText(content, Charsets.UTF_8) Log.d(TAG, "写入成功,文件路径:${file.absolutePath}") } catch (e: IOException) { Log.e(TAG, "写入失败", e) } }
调用时直接传入带换行的内容:
writeToFile("${beacon.distance}\r\n")
2. 解决仅一行数据的问题
你当前用appendText是追加模式,但出现单条记录的情况,大概率是以下原因:
- 未捕获IO异常:写入失败时无日志提示,误以为写入成功。
- 过滤逻辑重复处理同一设备:两部手机通信时,应只取目标Beacon而非遍历所有符合条件的设备。
- 换行符兼容性差:部分工具对
\n识别不佳,换成\r\n保证跨平台可读性。
优化后的Observer代码:
val centralRangingObserver = Observer<Collection<Beacon>> { beacons -> // 只取第一个符合条件的目标Beacon(两部手机通信仅需处理一个设备) val targetBeacon = beacons.firstOrNull { it.manufacturer == 0x0000 } targetBeacon?.let { beacon -> val distanceStr = "${beacon.distance}" Log.d(TAG, "$beacon 距离:$distanceStr 米") // 写入带换行的距离值,确保每行一条记录 writeToFile("$distanceStr\r\n") } ?: Log.d(TAG, "未找到目标Beacon") }
额外建议:
- 首次运行时清空文件(避免多次运行的数据混淆):
val downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) val file = File(downloadDir, "beacon_distance.txt") if (file.exists()) { file.delete() }
内容的提问来源于stack exchange,提问作者taktak
相关产品推荐
相关产品推荐

