You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:05:50