diff --git a/PRIVACY_POLICY.zh-CN.md b/PRIVACY_POLICY.zh-CN.md
new file mode 100644
index 00000000..8b4ee042
--- /dev/null
+++ b/PRIVACY_POLICY.zh-CN.md
@@ -0,0 +1,336 @@
+# 隐私政策
+
+最后更新:2023 年 2 月 27 日
+
+本隐私声明针对 **BLE Research Group**("公司"、"我们"或"我方"),描述了当您使用我们的服务("服务")时,我们可能如何以及为何收集、存储、使用和/或共享("处理")您的信息,例如当您:
+
+- 下载并使用我们的移动应用(Bluetooth Radar),或我们任何其他链接到此隐私声明的应用
+- 以其他相关方式与我们互动,包括任何销售、营销或活动
+
+有疑问或顾虑?阅读本隐私声明将帮助您了解您的隐私权和选择。如果您不同意我们的政策和做法,请不要使用我们的服务。如果您仍有任何疑问或顾虑,请通过 f@cking.software 与我们联系。
+
+## 要点摘要
+
+本摘要提供了我们隐私声明中的要点,但您可以通过点击每个要点后面的链接或使用下面的目录查找您想要的部分,了解有关这些主题的更多详细信息。您也可以点击此处直接转到我们的目录。
+
+**我们处理哪些个人信息?** 当您访问、使用或浏览我们的服务时,我们可能会根据您与 BLE Research Group 及服务的互动方式、您做出的选择以及您使用的产品和功能来处理个人信息。点击此处了解更多。
+
+**我们是否处理任何敏感个人信息?** 我们不处理敏感个人信息。
+
+**我们是否从第三方接收任何信息?** 我们不从第三方接收任何信息。
+
+**我们如何处理您的信息?** 我们处理您的信息以提供、改进和管理我们的服务,与您沟通,用于安全和欺诈预防,以及遵守法律。经您同意,我们也可能出于其他目的处理您的信息。我们仅在有合法法律理由时才处理您的信息。点击此处了解更多。
+
+**我们在什么情况下与哪些方共享个人信息?** 我们可能在特定情况下与特定第三方共享信息。点击此处了解更多。
+
+**我们如何保护您的信息安全?** 我们有组织和技术流程与程序来保护您的个人信息。然而,通过互联网的电子传输或信息存储技术无法保证 100% 安全,因此我们不能承诺或保证黑客、网络犯罪分子或其他未经授权的第三方不会能够破坏我们的安全并非法收集、访问、窃取或修改您的信息。点击此处了解更多。
+
+**您有哪些权利?** 根据您所在的地理位置,适用的隐私法可能意味着您对您的个人信息享有某些权利。点击此处了解更多。
+
+**您如何行使您的权利?** 行使您权利的最简单方式是填写我们可在此处获取的数据主体请求表,或联系我们。我们将根据适用的数据保护法律考虑并处理任何请求。
+
+想了解更多关于 BLE Research Group 如何处理我们收集的任何信息?点击此处完整查看声明。
+
+## 目录
+
+1. 我们收集哪些信息?
+2. 我们如何处理您的信息?
+3. 我们依靠哪些法律依据处理您的个人信息?
+4. 我们何时与谁共享您的个人信息?
+5. 我们保留您的信息多长时间?
+6. 我们如何保护您的信息安全?
+7. 我们是否从未成年人处收集信息?
+8. 您有哪些隐私权?
+9. 请勿追踪功能的控制
+10. 加利福尼亚州居民是否有特定的隐私权?
+11. 弗吉尼亚州居民是否有特定的隐私权?
+12. 我们是否会更新本声明?
+13. 您如何就本声明与我们联系?
+14. 您如何查看、更新或删除我们从您处收集的数据?
+
+### 1. 我们收集哪些信息?
+
+**您向我们披露的个人信息**
+
+简而言之:我们收集您提供给我们的个人信息。
+
+当您表示有兴趣获取有关我们或我们产品和服务的信息时、当您参与服务上的活动时、或当您以其他方式联系我们时,我们会收集您自愿提供给我们的个人信息。
+
+**敏感信息。** 我们不处理敏感信息。
+
+**应用数据。** 如果您使用我们的应用,在您选择授予我们访问或权限的情况下,我们还可能收集以下信息:
+- **地理位置信息。** 我们可能请求访问或权限来跟踪您移动设备的基于位置的信息,无论是持续跟踪还是在您使用我们的移动应用期间,以提供某些基于位置的服务。如果您希望更改我们的访问或权限,可以在设备设置中进行。
+- **移动设备访问。** 我们可能请求访问或权限使用您移动设备的某些功能,包括您移动设备的蓝牙、传感器和其他功能。如果您希望更改我们的访问或权限,可以在设备设置中进行。
+
+这些信息主要用于维护我们应用的安全和运行、进行故障排除,以及用于我们的内部分析和报告目的。
+
+您向我们提供的所有个人信息必须真实、完整和准确,并且您必须将此类个人信息的任何变更通知我们。
+
+**自动收集的信息**
+
+简而言之:某些信息——例如您的互联网协议(IP)地址和/或浏览器和设备特征——在您访问我们的服务时会被自动收集。
+
+当您访问、使用或浏览服务时,我们会自动收集某些信息。这些信息不会透露您的具体身份(如您的姓名或联系方式),但可能包括设备和使用信息,如您的 IP 地址、浏览器和设备特征、操作系统、语言偏好、引用 URL、设备名称、国家、位置、关于您如何以及何时使用我们服务的信息以及其他技术信息。这些信息主要用于维护我们服务的安全和运行,以及用于我们的内部分析和报告目的。
+
+我们收集的信息包括:
+- **日志和使用数据。** 日志和使用数据是与服务相关的诊断、使用和性能信息,当您访问或使用我们的服务时我们的服务器会自动收集并记录在日志文件中。根据您与我们的互动方式,此日志数据可能包括您的 IP 地址、设备信息、浏览器类型和设置,以及您在服务中的活动信息(如与您使用相关的日期/时间戳、查看的页面和文件、搜索以及您采取的其他操作,如您使用哪些功能)、设备事件信息(如系统活动、错误报告(有时称为"崩溃转储")和硬件设置)。
+- **设备数据。** 我们收集设备数据,如有关您用于访问服务的计算机、手机、平板电脑或其他设备的信息。根据所使用的设备,此设备数据可能包括您的 IP 地址(或代理服务器)、设备和应用识别号、位置、浏览器类型、硬件型号、互联网服务提供商和/或移动运营商、操作系统以及系统配置信息。
+- **位置数据。** 我们收集位置数据,如有关您设备位置的信息,可以是精确的也可以是不精确的。我们收集多少信息取决于您用于访问服务的设备的类型和设置。例如,我们可能使用 GPS 和其他技术来收集告诉我们您当前位置的地理位置数据(基于您的 IP 地址)。您可以通过拒绝访问信息或在设备上禁用位置设置来选择不允许我们收集此信息。但是,如果您选择退出,您可能无法使用服务的某些方面。
+
+### 2. 我们如何处理您的信息?
+
+简而言之:我们处理您的信息以提供、改进和管理我们的服务,与您沟通,用于安全和欺诈预防,以及遵守法律。经您同意,我们也可能出于其他目的处理您的信息。
+
+我们根据您与我们服务的互动方式,出于多种原因处理您的个人信息,包括:
+
+**为挽救或保护个人的重大利益。** 在必要时为挽救或保护个人的重大利益(例如防止伤害),我们可能处理您的信息。
+
+### 3. 我们依靠哪些法律依据处理您的信息?
+
+简而言之:我们仅在认为必要且我们有适用法律下的有效法律理由(即法律依据)时才处理您的个人信息,例如经您同意、遵守法律、向您提供服务以履行或履行我们的合同义务、保护您的权利,或履行我们的合法商业利益。
+
+如果您位于欧盟或英国,本节适用于您。
+
+《通用数据保护条例》(GDPR)和英国 GDPR 要求我们解释我们赖以处理您个人信息的有效法律依据。因此,我们可能依靠以下法律依据来处理您的个人信息:
+- **同意。** 如果您已给予我们许可(即同意)将您的个人信息用于特定目的,我们可能处理您的信息。您可以随时撤回您的同意。点击此处了解更多。
+- **法律义务。** 当我们认为有必要遵守我们的法律义务时,我们可能处理您的信息,例如与执法机构或监管机构合作、行使或捍卫我们的法律权利,或在我们涉及的诉讼中披露您的信息作为证据。
+- **重大利益。** 当我们认为有必要保护您的重大利益或第三方的重大利益时,我们可能处理您的信息,例如涉及对任何人安全的潜在威胁的情况。
+
+在法律术语上,根据欧洲数据保护法,我们通常是本隐私声明中所述个人信息的"数据控制者",因为我们决定我们执行的数据处理的方式和/或目的。本隐私声明不适用于我们代表客户作为"数据处理者"处理的个人信息。在这些情况下,我们向其提供服务并与其签订数据处理协议的客户是负责您个人信息的"数据控制者",我们仅根据您的指示代表他们处理您的信息。如果您想了解更多关于我们客户的隐私做法,您应该阅读他们的隐私政策并将您的任何问题直接向他们提出。
+
+如果您位于加拿大,本节适用于您。
+
+如果您已给予我们特定许可(即明确同意)将您的个人信息用于特定目的,或在可以推断您许可的情况下(即默示同意),我们可能处理您的信息。您可以随时撤回您的同意。点击此处了解更多。
+
+在某些特殊情况下,根据适用法律,我们可能在未经您同意的情况下被法律允许处理您的信息,例如:
+- 如果收集显然符合个人利益且无法及时获得同意
+- 用于调查以及欺诈检测和预防
+- 用于满足某些条件的商业交易
+- 如果信息包含在证人陈述中,且收集对于评估、处理或解决保险索赔是必要的
+- 用于识别受伤、生病或已故人员并与近亲沟通
+- 如果我们有合理理由相信个人已经、正在或可能成为金融虐待的受害者
+- 如果可以合理预期经同意的收集和使用会损害信息的可用性或准确性,且收集对于调查违反协议或违反加拿大或某省法律的目的是合理的
+- 如果需要披露以遵守传票、逮捕令、法院命令或与记录制作相关的法院规则
+- 如果信息是由个人在其就业、商业或职业过程中产生的,且收集与信息产生的目的一致
+- 如果收集仅用于新闻、艺术或文学目的
+- 如果信息是公开可用的且由法规指定
+
+### 4. 我们何时与谁共享您的个人信息?
+
+简而言之:我们可能在本节所述的特定情况下和/或与以下第三方共享信息。
+
+我们可能需要在以下情况下共享您的个人信息:
+- **业务转让。** 我们可能在与任何合并、公司资产出售、融资或收购我们全部或部分业务给另一家公司相关的谈判期间或之中共享或转让您的信息。
+- **业务合作伙伴。** 我们可能与我们的业务合作伙伴共享您的信息,以向您提供某些产品、服务或促销。
+
+### 5. 我们保留您的信息多长时间?
+
+简而言之:除非法律另有要求,我们会在实现本隐私声明中概述的目的所需的时间内保留您的信息。
+
+我们仅会在本隐私声明中规定的目的所需的时间内保留您的个人信息,除非法律要求或许可更长的保留期(如税务、会计或其他法律要求)。
+
+当我们没有持续的合法业务需要处理您的个人信息时,我们将删除或匿名化此类信息,或者如果这不可能(例如,因为您的个人信息已存储在备份档案中),我们将安全地存储您的个人信息并将其与任何进一步处理隔离,直到可以删除为止。
+
+### 6. 我们如何保护您的信息安全?
+
+简而言之:我们旨在通过一套组织和技术安全措施来保护您的个人信息。
+
+我们已实施适当和合理的技术与组织安全措施,旨在保护我们处理的任何个人信息的安全。然而,尽管我们有保障措施和保护您信息的努力,通过互联网的电子传输或信息存储技术无法保证 100% 安全,因此我们不能承诺或保证黑客、网络犯罪分子或其他未经授权的第三方不会能够破坏我们的安全并非法收集、访问、窃取或修改您的信息。虽然我们将尽最大努力保护您的个人信息,但向我们的服务传输个人信息和从我们的服务传输个人信息的风险由您自行承担。您应仅在安全环境中访问服务。
+
+### 7. 我们是否从未成年人处收集信息?
+
+简而言之:我们不会故意从 18 岁以下儿童处收集数据或向其进行营销。
+
+我们不会故意从 18 岁以下儿童处征集数据或向其进行营销。使用服务即表示您声明您至少 18 岁,或者您是此类未成年人的父母或监护人并同意此类未成年受抚养人使用服务。如果我们得知已收集 18 岁以下用户的个人信息,我们将停用该账户并采取合理措施及时从我们的记录中删除此类数据。如果您发现我们可能从 18 岁以下儿童处收集了任何数据,请通过 __________ 与我们联系。
+
+### 8. 您有哪些隐私权?
+
+简而言之:在某些地区,如欧洲经济区(EEA)、英国(UK)和加拿大,您享有允许您更大程度地访问和控制您个人信息的权利。您可以随时查看、更改或终止您的账户。
+
+在某些地区(如 EEA、英国和加拿大),根据适用的数据保护法律您享有某些权利。这些权利可能包括:(i) 请求访问和获取您个人信息副本的权利;(ii) 请求更正或删除的权利;(iii) 限制处理您个人信息的权利;以及 (iv) 在适用情况下数据可携带的权利。在某些情况下,您可能还有权反对处理您的个人信息。您可以通过使用下面"您如何就本声明与我们联系?"部分中提供的联系方式联系我们来提出此类请求。
+
+我们将根据适用的数据保护法律考虑并处理任何请求。
+
+如果您位于 EEA 或英国,并且您认为我们正在非法处理您的个人信息,您还有权向您当地的数据保护监管机构投诉。您可以在此处找到他们的联系方式:https://ec.europa.eu/justice/data-protection/bodies/authorities/index_en.htm。
+
+如果您位于瑞士,数据保护当局的联系方式可在此处获取:https://www.edoeb.admin.ch/edoeb/en/home.html。
+
+**撤回您的同意:** 如果我们依靠您的同意来处理您的个人信息(根据适用法律可能是明确和/或默示同意),您有权随时撤回您的同意。您可以通过使用下面"您如何就本声明与我们联系?"部分中提供的联系方式联系我们来随时撤回您的同意。
+
+但是,请注意,这不会影响撤回前处理的合法性,并且在适用法律允许的情况下,也不会影响依靠同意以外的合法处理依据进行的您个人信息的处理。
+
+如果您对您的隐私权有疑问或意见,可以发送电子邮件至 f@cking.software。
+
+### 9. 请勿追踪功能的控制
+
+大多数网络浏览器和一些移动操作系统及移动应用程序包含一个"请勿追踪"("DNT")功能或设置,您可以激活它以表达您的隐私偏好,即不希望有关您在线浏览活动的数据被监控和收集。目前,识别和实施 DNT 信号的统一技术标准尚未最终确定。因此,我们目前不响应 DNT 浏览器信号或任何其他自动传达您不希望被在线追踪选择的机制。如果未来我们必须遵循的在线跟踪标准被采用,我们将在本隐私声明的修订版本中告知您该做法。
+
+### 10. 加利福尼亚州居民是否有特定的隐私权?
+
+简而言之:是的,如果您是加利福尼亚州居民,您被授予有关访问您个人信息的特定权利。
+
+《加利福尼亚州民法典》第 1798.83 条,也称为"照亮之光"法,允许我们的加利福尼亚州居民用户每年一次免费请求和获取有关我们为直接营销目的向第三方披露的个人信息类别(如有),以及我们在上一日历年中与其共享个人信息的所有第三方的名称和地址的信息。如果您是加利福尼亚州居民并希望提出此类请求,请使用下面提供的联系信息以书面形式向我们提交您的请求。
+
+如果您未满 18 岁、居住在加利福尼亚州并在服务上拥有注册账户,您有权请求删除您在服务上公开发布的不需要的数据。要请求删除此类数据,请使用下面提供的联系信息与我们联系,并附上与您账户关联的电子邮件地址以及您居住在加利福尼亚州的声明。我们将确保数据不会在服务上公开显示,但请注意数据可能不会从我们所有系统(如备份等)中完全或全面删除。
+
+**CCPA 隐私声明**
+
+《加利福尼亚州法规法典》将"居民"定义为:
+
+(1) 出于非临时或短暂目的在加利福尼亚州境内的每个个人;以及
+(2) 居住在加利福尼亚州但出于临时或短暂目的在加利福尼亚州境外的每个个人。
+
+所有其他个人被定义为"非居民"。
+
+如果此"居民"定义适用于您,我们必须遵守有关您个人信息的某些权利和义务。
+
+**我们收集哪些类别的个人信息?**
+
+在过去十二(12)个月中,我们收集了以下类别的个人信息:
+
+| 类别 | 示例 | 是否已收集 |
+|---|---|---|
+| A. 标识符 | 联系方式,如真实姓名、别名、邮政地址、电话或移动联系号码、唯一个人标识符、在线标识符、互联网协议地址、电子邮件地址和账户名称 | 否 |
+| B. 加利福尼亚客户记录法规中列出的个人信息类别 | 姓名、联系信息、教育、就业、就业历史和财务信息 | 否 |
+| C. 加利福尼亚或联邦法律下的受保护分类特征 | 性别和出生日期 | 否 |
+| D. 商业信息 | 交易信息、购买历史、财务详情和支付信息 | 否 |
+| E. 生物识别信息 | 指纹和声纹 | 否 |
+| F. 互联网或其他类似网络活动 | 浏览历史、搜索历史、在线行为、兴趣数据,以及与我们和其他网站、应用、系统和广告的互动 | 否 |
+| G. 地理位置数据 | 设备位置 | 否 |
+| H. 音频、电子、视觉、热、嗅觉或类似信息 | 与我们业务活动相关创建的图像和音频、视频或通话录音 | 否 |
+| I. 专业或就业相关信息 | 为在商业层面向您提供我们服务的业务联系方式,或如果您向我们申请工作的职位、工作历史和专业资格 | 否 |
+| J. 教育信息 | 学生记录和目录信息 | 否 |
+| K. 从其他个人信息得出的推论 | 从上述任何收集的个人信息得出的推论,以创建关于例如个人偏好和特征的档案或摘要 | 否 |
+| L. 敏感个人信息 | | 否 |
+
+在您通过以下方式与我们亲自、在线或通过电话或邮件互动的情况下,我们还可能收集这些类别以外的其他个人信息:
+- 通过我们的客户支持渠道获得帮助;
+- 参与客户调查或竞赛;以及
+- 协助提供我们的服务并回应您的询问。
+
+**我们如何使用和共享您的个人信息?**
+
+有关我们数据收集和共享做法的更多信息,请参见本隐私声明。
+
+您可以通过电子邮件 f@cking.software 与我们联系,或参阅本文档底部的联系方式。
+
+如果您使用授权代理人行使您的退出权,如果授权代理人未提交证明其已被有效授权代表您行事的证据,我们可能会拒绝请求。
+
+**您的信息会与其他任何人共享吗?**
+
+我们可能根据我们与每个服务提供商之间的书面合同,与我们的服务提供商披露您的个人信息。每个服务提供商都是代表我们处理信息的营利性实体,遵循 CCPA 规定的相同严格隐私保护义务。
+
+我们可能将您的个人信息用于我们自己的商业目的,例如进行技术开发和演示的内部研究。这不被视为"出售"您的个人信息。
+
+BLE Research Group 在过去十二(12)个月内未为商业或商务目的向第三方披露、出售或共享任何个人信息。BLE Research Group 将来不会出售或共享属于网站访问者、用户和其他消费者的个人信息。
+
+**您对个人数据的权利**
+
+**请求删除数据的权利——删除请求**
+
+您可以要求删除您的个人信息。如果您要求我们删除您的个人信息,我们将尊重您的请求并删除您的个人信息,但受法律规定的某些例外情况限制,例如(但不限于)另一位消费者行使其言论自由权、我们因法律义务产生的合规要求,或可能需要用于防范非法活动的任何处理。
+
+**被告知的权利——知情请求**
+
+根据具体情况,您有权知道:
+- 我们是否收集和使用您的个人信息;
+- 我们收集的个人信息类别;
+- 所收集个人信息的使用目的;
+- 我们是否向第三方出售或共享个人信息;
+- 我们为商业目的出售、共享或披露的个人信息类别;
+- 个人信息被出售、共享或为商业目的披露给的第三方类别;
+- 收集、出售或共享个人信息的商业或商务目的;以及
+- 我们收集的关于您的具体个人信息。
+
+根据适用法律,我们没有义务为响应消费者请求而提供或删除已去标识化的消费者信息,或为验证消费者请求而重新识别个人数据。
+
+**行使消费者隐私权不受歧视的权利**
+
+如果您行使您的隐私权,我们不会歧视您。
+
+**限制使用和披露敏感个人信息的权利**
+
+我们不处理消费者的敏感个人信息。
+
+**验证流程**
+
+收到您的请求后,我们需要验证您的身份,以确定您就是我们系统中存有其信息的同一个人。这些验证工作要求我们请您提供信息,以便我们将其与您之前提供给我们的信息进行匹配。例如,根据您提交的请求类型,我们可能会请您提供某些信息,以便我们将您提供的信息与我们已存档的信息进行匹配,或者我们可能通过您之前提供给我们的通信方式(如电话或电子邮件)与您联系。我们也可能根据情况使用其他验证方法。
+
+我们仅会使用您请求中提供的个人信息来验证您的身份或提出请求的权限。在可能的情况下,我们将避免为验证目的向您请求额外信息。但是,如果我们无法从我们已维护的信息中验证您的身份,我们可能会请求您提供额外信息以验证您的身份以及用于安全或欺诈预防目的。我们将在完成验证后立即删除此类额外提供的信息。
+
+**其他隐私权**
+- 您可以反对处理您的个人信息。
+- 如果您的个人数据不正确或不再相关,您可以请求更正,或要求限制信息的处理。
+- 您可以指定授权代理人代表您根据 CCPA 提出请求。如果授权代理人未提交证明其已根据 CCPA 被有效授权代表您行事的证据,我们可能会拒绝其请求。
+- 您可以请求选择退出将来向第三方出售或共享您的个人信息。收到退出请求后,我们将在可行的情况下尽快处理该请求,但最迟不超过请求提交之日起十五(15)天。
+
+要行使这些权利,您可以通过电子邮件 f@cking.software 与我们联系,或参阅本文档底部的联系方式。如果您对我们如何处理您的数据有投诉,我们希望听取您的意见。
+
+### 11. 弗吉尼亚州居民是否有特定的隐私权?
+
+简而言之:是的,如果您是弗吉尼亚州居民,您可能被授予有关访问和使用您个人信息的特定权利。
+
+**弗吉尼亚 CDPA 隐私声明**
+
+根据《弗吉尼亚州消费者数据保护法》(CDPA):
+
+"消费者"指仅在个人或家庭背景下行事的弗吉尼亚州联邦自然人居民。不包括在商业或就业背景下行事的自然人。
+
+"个人数据"指与已识别或可识别自然人相关联或合理可关联的任何信息。"个人数据"不包括去标识化数据或公开可用信息。
+
+"出售个人数据"指为金钱对价交换个人数据。
+
+如果此"消费者"定义适用于您,我们必须遵守有关您个人数据的某些权利和义务。
+
+我们收集、使用和披露的关于您的信息将根据您与 BLE Research Group 及我们服务的互动方式而有所不同。要了解更多,请访问以下链接:
+- 我们收集的个人数据
+- 我们如何使用您的个人数据
+- 我们何时与谁共享您的个人数据
+- 您对个人数据的权利
+ - 被告知我们是否正在处理您个人数据的权利
+ - 访问您个人数据的权利
+ - 更正您个人数据中不准确之处的权利
+ - 请求删除您个人数据的权利
+ - 获取您之前与我们共享的个人数据副本的权利
+ - 如果您的个人数据用于定向广告、出售个人数据或为产生法律或类似重大影响的决策进行分析("分析"),选择退出处理您个人数据的权利
+
+BLE Research Group 未为商业或商务目的向第三方出售任何个人数据。BLE Research Group 将来不会出售属于网站访问者、用户和其他消费者的个人数据。
+
+**行使弗吉尼亚 CDPA 赋予您的权利**
+
+有关我们数据收集和共享做法的更多信息,请参见本隐私声明。
+
+您可以通过电子邮件 f@cking.software、访问我们的数据主体请求表,或参阅本文档底部的联系方式与我们联系。
+
+如果您使用授权代理人行使您的权利,如果授权代理人未提交证明其已被有效授权代表您行事的证据,我们可能会拒绝请求。
+
+**验证流程**
+
+我们可能会请求您提供合理必要的额外信息以验证您和您的消费者请求。如果您通过授权代理人提交请求,我们可能需要收集额外信息以在处理您的请求前验证您的身份。
+
+收到您的请求后,我们将在不无故拖延的情况下回复,但在所有情况下均在收到后四十五(45)天内。在合理必要的情况下,回复期可延长一次,延长四十五(45)天。我们将在初始 45 天回复期内告知您任何此类延长以及延长原因。
+
+**申诉权**
+
+如果我们拒绝对您的请求采取行动,我们将告知您我们的决定及其背后的理由。如果您希望对我们的决定提出申诉,请发送电子邮件至 f@cking.software。在收到申诉后六十(60)天内,我们将以书面形式告知您针对申诉采取或未采取的任何行动,包括决定理由的书面说明。如果您的申诉被拒绝,您可以联系总检察长提交投诉。
+
+### 12. 我们是否会更新本声明?
+
+简而言之:是的,我们会根据需要更新本声明以保持遵守相关法律。
+
+我们可能会不时更新本隐私声明。更新版本将通过更新的"修订"日期来指示,更新版本将在可访问时立即生效。如果我们对本隐私声明做出重大更改,我们可能会通过显著发布此类更改的通知或直接向您发送通知来告知您。我们鼓励您经常查看本隐私声明,以了解我们如何保护您的信息。
+
+### 13. 您如何就本声明与我们联系?
+
+如果您对本声明有疑问或意见,可以发送电子邮件至 f@cking.software。
+
+如果您是欧洲经济区的居民,您个人信息的"数据控制者"是 BLE Research Group。BLE Research Group 已指定 BLE Research Group 为其在 EEA 的代表。您可以通过电子邮件 f@cking.software 或邮寄至以下地址直接联系他们,了解 BLE Research Group 对您信息的处理:
+
+塔林
+爱沙尼亚
+
+### 14. 您如何查看、更新或删除我们从您处收集的数据?
+
+根据您所在国家/地区的适用法律,您可能有权请求访问我们从您处收集的个人信息、更改该信息或删除它。要请求查看、更新或删除您的个人信息,请点击此处提交请求表。
+
+本隐私政策使用 Termly 的隐私政策生成器创建。
diff --git a/README.zh-CN.md b/README.zh-CN.md
new file mode 100644
index 00000000..fb259ca9
--- /dev/null
+++ b/README.zh-CN.md
@@ -0,0 +1,33 @@
+
+
+# 蓝牙雷达
+
+
+
+
+
+
+> [!WARNING]
+> 本项目**仅用于教育、安全研究和个人调查目的**。**作者不认可或鼓励将本软件用于任何非法或不道德的活动**。您**需自行负责**确保使用本工具时遵守所有适用的法律法规。
+
+低功耗蓝牙(BLE)是一种广泛使用的无线协议,为您周围的各种设备提供支持——从耳机、智能手表、健身追踪器到 AirTag、物联网设备、游戏控制器,甚至现代情趣用品。BLE 设备通过广播小型数据包进行通信,其中可能包含设备标识符、元数据和其他连接所需的信息。
+
+这些广播虽然对设备功能至关重要,但也可能被用来追踪您的存在和行动。例如,一副廉价的无线耳机可能会公开暴露一个持久标识符。任何在附近监听 BLE 数据包的人——无论是政府、公司还是恶意行为者——都可能在未经您同意的情况下利用这些信息追踪您。
+
+幸运的是,许多现代设备在 BLE 中实现了隐私功能以防止追踪,例如随机化地址和有限广播。BLE Radar 帮助您区分保护您隐私的设备和可能被追踪的设备。通过分析您周围的 BLE 流量,应用让您了解哪些设备可以安全使用。
+
+除了分析之外,BLE Radar 还可以实时保护您。当可疑设备在附近或某台设备随您移动一段时间时,应用可以提醒您,让您对潜在的跟踪或不必要的追踪获得早期预警。您可以根据设备标识符、类型或行为配置提醒,以满足您的安全需求。
+
+开发这个应用的目标是让您能够了解和控制环境中的 BLE 设备。了解哪些设备正在广播可追踪信息、哪些注重隐私,能让您对日常使用、佩戴和交互的设备做出明智的决定。
+
+应用主要功能:
+* 扫描、分析和跟踪周围的蓝牙设备;
+* 为雷达创建灵活的筛选条件;
+* 对扫描到的 BLE 设备进行深度分析,从可用的 GATT 服务获取数据;
+* GATT 服务浏览器;
+* 通过元数据识别设备类型;
+* 估算到设备的大致距离。
+
+本应用不会共享您的个人数据或地理位置,所有工作均在离线状态下完成。
+
+
diff --git a/app/src/main/java/f/cking/software/data/repo/SettingsRepository.kt b/app/src/main/java/f/cking/software/data/repo/SettingsRepository.kt
index 3b5febe9..650d9439 100644
--- a/app/src/main/java/f/cking/software/data/repo/SettingsRepository.kt
+++ b/app/src/main/java/f/cking/software/data/repo/SettingsRepository.kt
@@ -139,6 +139,14 @@ class SettingsRepository(
sharedPreferences.edit { putBoolean(KEY_WAKE_UP_SCREEN_WHILE_SCANNING, value) }
}
+ fun setAppLanguage(languageTag: String) {
+ sharedPreferences.edit { putString(KEY_APP_LANGUAGE, languageTag) }
+ }
+
+ fun getAppLanguage(): String {
+ return sharedPreferences.getString(KEY_APP_LANGUAGE, DEFAULT_APP_LANGUAGE) ?: DEFAULT_APP_LANGUAGE
+ }
+
companion object {
private const val KEY_GARBAGING_TIME = "key_garbaging_time"
private const val KEY_USE_GPS_ONLY = "key_use_gps_location_only"
@@ -154,6 +162,9 @@ class SettingsRepository(
private const val KEY_DISCLAIMER_WAS_ACCEPTED = "key_disclaimer_was_accepted"
private const val KEY_WHAT_IS_THIS_APP_FOR_WAS_SHOWN = "what_is_this_app_for_was_shown"
private const val KEY_WAKE_UP_SCREEN_WHILE_SCANNING = "key_wake_up_screen_while_scanning"
+ private const val KEY_APP_LANGUAGE = "key_app_language"
+
+ const val DEFAULT_APP_LANGUAGE = "system"
const val NO_APP_LAUNCH_TIME = -1L
const val NO_ENJOY_THE_APP_STARTING_POINT = -1L
diff --git a/app/src/main/java/f/cking/software/ui/settings/SettingsScreen.kt b/app/src/main/java/f/cking/software/ui/settings/SettingsScreen.kt
index 71a62889..c683813d 100644
--- a/app/src/main/java/f/cking/software/ui/settings/SettingsScreen.kt
+++ b/app/src/main/java/f/cking/software/ui/settings/SettingsScreen.kt
@@ -3,8 +3,10 @@ package f.cking.software.ui.settings
import android.text.format.Formatter
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
@@ -32,6 +34,7 @@ import androidx.compose.ui.unit.sp
import com.vanpra.composematerialdialogs.rememberMaterialDialogState
import f.cking.software.BuildConfig
import f.cking.software.R
+import f.cking.software.data.repo.SettingsRepository
import f.cking.software.dateTimeStringFormat
import f.cking.software.utils.graphic.BottomNavigationSpacer
import f.cking.software.utils.graphic.FABSpacer
@@ -330,6 +333,82 @@ object SettingsScreen {
viewModel.toggleWakeUpOnScreen()
}
)
+ LanguageSelector(viewModel = viewModel)
+ }
+ }
+
+ @Composable
+ private fun LanguageSelector(viewModel: SettingsViewModel) {
+ val dialogState = rememberMaterialDialogState()
+ val currentLanguageName = when (viewModel.appLanguage) {
+ "en" -> stringResource(R.string.language_english)
+ "zh-rCN" -> stringResource(R.string.language_chinese)
+ "hu" -> stringResource(R.string.language_hungarian)
+ "ru" -> stringResource(R.string.language_russian)
+ else -> stringResource(R.string.language_system)
+ }
+
+ ThemedDialog(
+ dialogState = dialogState,
+ buttons = {
+ negativeButton(
+ text = stringResource(R.string.cancel),
+ textStyle = TextStyle(color = MaterialTheme.colorScheme.onSurface)
+ ) { dialogState.hide() }
+ },
+ ) {
+ Column(Modifier.padding(16.dp)) {
+ Text(text = stringResource(R.string.language_dialog_title), fontSize = 18.sp, fontWeight = FontWeight.Bold)
+ Spacer(modifier = Modifier.height(8.dp))
+ LanguageOption(textRes = R.string.language_system) {
+ viewModel.onLanguageSelected(SettingsRepository.DEFAULT_APP_LANGUAGE)
+ dialogState.hide()
+ }
+ LanguageOption(textRes = R.string.language_english) {
+ viewModel.onLanguageSelected("en")
+ dialogState.hide()
+ }
+ LanguageOption(textRes = R.string.language_chinese) {
+ viewModel.onLanguageSelected("zh-rCN")
+ dialogState.hide()
+ }
+ LanguageOption(textRes = R.string.language_hungarian) {
+ viewModel.onLanguageSelected("hu")
+ dialogState.hide()
+ }
+ LanguageOption(textRes = R.string.language_russian) {
+ viewModel.onLanguageSelected("ru")
+ dialogState.hide()
+ }
+ }
+ }
+
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .clickable { dialogState.show() }
+ .padding(horizontal = 16.dp, vertical = 8.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ ) {
+ Column(
+ modifier = Modifier.weight(1f),
+ ) {
+ Text(text = stringResource(R.string.language))
+ Spacer(modifier = Modifier.height(4.dp))
+ Text(text = currentLanguageName, fontWeight = FontWeight.Light, fontSize = 12.sp)
+ }
+ }
+ }
+
+ @Composable
+ private fun LanguageOption(textRes: Int, onClick: () -> Unit) {
+ Box(
+ modifier = Modifier
+ .fillMaxWidth()
+ .clickable { onClick.invoke() }
+ .padding(vertical = 8.dp)
+ ) {
+ Text(text = stringResource(textRes))
}
}
diff --git a/app/src/main/java/f/cking/software/ui/settings/SettingsViewModel.kt b/app/src/main/java/f/cking/software/ui/settings/SettingsViewModel.kt
index f3a3c263..7b5e48cf 100644
--- a/app/src/main/java/f/cking/software/ui/settings/SettingsViewModel.kt
+++ b/app/src/main/java/f/cking/software/ui/settings/SettingsViewModel.kt
@@ -4,9 +4,11 @@ import android.app.Application
import android.net.Uri
import android.provider.Settings
import android.widget.Toast
+import androidx.appcompat.app.AppCompatDelegate
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
+import androidx.core.os.LocaleListCompat
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import f.cking.software.BuildConfig
@@ -57,6 +59,7 @@ class SettingsViewModel(
var wakeUpWhileScanning: Boolean by mutableStateOf(settingsRepository.getWakeUpScreenWhileScanning())
var silentModeEnabled: Boolean by mutableStateOf(settingsRepository.getSilentMode())
var deepAnalysisEnabled: Boolean by mutableStateOf(settingsRepository.getEnableDeepAnalysis())
+ var appLanguage: String by mutableStateOf(settingsRepository.getAppLanguage())
val databaseInfo by getDatabaseInfoInteractor.execute().collectAsState(viewModelScope, null)
@@ -162,6 +165,17 @@ class SettingsViewModel(
settingsRepository.setSilentMode(!settingsRepository.getSilentMode())
}
+ fun onLanguageSelected(languageTag: String) {
+ settingsRepository.setAppLanguage(languageTag)
+ appLanguage = languageTag
+ val localeList = if (languageTag == SettingsRepository.DEFAULT_APP_LANGUAGE) {
+ LocaleListCompat.getEmptyLocaleList()
+ } else {
+ LocaleListCompat.forLanguageTags(languageTag)
+ }
+ AppCompatDelegate.setApplicationLocales(localeList)
+ }
+
fun onReportIssueClick() {
intentHelper.openUrl(BuildConfig.REPORT_ISSUE_URL)
}
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 2af91717..8293e436 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -169,4 +169,11 @@
Bekapcsolás
ISMERETLEN
örök: %1$s | legutóbbi frissítés: %2$s ideje
+ Nyelv
+ Alkalmazás nyelve
+ Rendszer szerint
+ English
+ 中文
+ Magyar
+ Русский
\ No newline at end of file
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 251e97bb..f729fb96 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -83,6 +83,13 @@
Выключить любую сетевую коммуникацию от приложения. Может быть полезно чтобы экономить трафик или оставаться незаметным в сети.
Управление базой данных
Настройки
+ Язык
+ Язык приложения
+ Как в системе
+ English
+ 中文
+ Magyar
+ Русский
Оффлайн режим выключен. Вы можете включить его в настройках.
Поиск производителя
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
new file mode 100644
index 00000000..f526ea06
--- /dev/null
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -0,0 +1,394 @@
+
+ BLE Radar
+
+
+ 搜索
+ 取消
+ 确认
+ 返回
+ 保存
+ 关闭
+ 知道了
+ 删除
+ 选择
+ 清除
+ 获取
+ 分析
+ 拒绝
+ 确定
+ 开启
+ 报告
+ 接受
+ Shaders test
+ 正在优化数据库,可能需要一分钟…
+
+
+ - %d 天
+ - %d 天
+ - %d 天
+ - %d 天
+ - %d 天
+ - %d 天
+
+
+
+ - %d 小时
+ - %d 小时
+ - %d 小时
+ - %d 小时
+ - %d 小时
+ - %d 小时
+
+
+
+ - %d 分钟
+ - %d 分钟
+ - %d 分钟
+ - %d 分钟
+ - %d 分钟
+ - %d 分钟
+
+
+
+ - %d 秒
+ - %d 秒
+ - %d 秒
+ - %d 秒
+ - %d 秒
+ - %d 秒
+
+
+
+ 暂无位置数据
+ 仅在扫描器启动时获取位置
+ 上次位置更新时间:%s
+ 纬度:%s
+ 经度:%s
+ 清理垃圾数据
+ 从文件恢复数据库?
+ 当前数据库将被覆盖,数据将会丢失
+ 项目用途
+ 恢复数据库
+ 将数据库保存到设备存储?
+ 数据库包含您的位置历史记录。请妥善保管,这是您的敏感数据
+ 备份数据库
+ 清除位置历史记录
+ 仅使用 GPS 定位
+ 融合位置提供器使用推测性地理定位,可在 GPS 信号较差的区域提升性能,但会降低定位精度。禁用融合定位可提高数据准确性,但会对功耗产生负面影响。
+ 位置历史记录已清除
+ 备份失败。请查看日志中的报告
+ 未选择目录
+ 未选择文件
+ 无法恢复数据库。请查看日志中的报告
+ 数据库已从备份恢复
+ 备份成功
+ 已清除 %s 个垃圾设备
+ 确定清除所有位置历史记录?
+ 开机自启动
+ 发现问题或有功能建议?
+ 关于
+ 版本:%1$s(%2$s)
+ 构建类型:正式版
+ 构建类型:调试版
+ 发行渠道:%s
+ 需要此权限以便在后台扫描时降低屏幕亮度,从而节省电量
+ BLE 扫描时保持屏幕常亮
+ 启用此功能后,应用在扫描 BLE 设备时会暂时保持屏幕唤醒。在 Android 上,屏幕关闭时 BLE 扫描会受到限制或暂停,因此开启此功能可确保准确的设备检测。关闭此功能可节省电量,但屏幕关闭时扫描可能不够准确。
+ %s 是一个开源项目。您可以在 GitHub 上找到源代码。欢迎提问、贡献代码并给仓库点 Star!
+ 前往 GitHub
+ 一张神秘猫咪照片
+ 离线模式
+ 关闭应用中的所有网络通信。有助于节省流量。
+ 数据库操作
+ 数据库信息
+ 大小:%s
+ 设备记录:%s
+ 位置记录:%s
+ 应用设置
+ 语言
+ 应用语言
+ 跟随系统
+ English
+ 中文
+ Magyar
+ Русский
+ 离线模式已关闭。您可以在设置中更改。
+ 深度分析(实验性)
+ 如果启用深度分析,应用将向所有发现的设备请求更多信息。每次扫描将提供更多数据,但也会增加扫描时间和功耗,并可能暴露您的存在。
+ 启用深度分析?(实验性)
+ 深度分析不仅扫描 BLE 设备,还会主动向其可访问的 GATT 服务请求数据。\n\n某些设备可能需要身份验证或加密才能访问特定服务。在这种情况下,可能会触发配对请求。\n\n此模式也可能使您的设备对附近设备更加可见。\n\n仅在您了解其工作原理并接受这些副作用时才启用此功能。
+ 我知道自己在做什么
+ 取消
+ 启用
+
+
+ 搜索制造商
+
+
+ 选择位置
+ 半径:%.1f 米
+
+
+ 选择筛选条件
+ 按名称
+ 当设备名称匹配指定的子字符串或正则表达式时触发
+ 按地址
+ 设备地址
+ 当设备地址匹配时触发
+ 按首次检测时间
+ 如果设备在选定时间段内首次被检测到则触发
+ 按末次检测时间
+ 如果设备在选定时间段内末次被检测到则触发
+ 按收藏状态
+ 如果设备被标记为收藏则触发
+ 按配对状态
+ 如果设备已与您的设备配对则触发
+ 按制造商
+ 当设备芯片制造商匹配时触发
+ 按最短失联时间
+ 如果设备超出范围达到选定时间则触发。有助于避免设备一直在附近时重复检测。
+ Apple AirDrop 联系人
+ [已弃用] 当设备是 Apple 设备且 AirDrop 联系人匹配时触发
+ 设备正在跟随我
+ 如果设备在选定的时间和距离内保持在范围内并随您移动则触发
+ 任一满足
+ 一组筛选条件的 OR 运算符
+ 全部满足
+ 一组筛选条件的 AND 运算符
+ 非
+ NOT 运算符
+ 按设备位置
+ 如果设备在选定时间段内曾在特定位置被发现则触发
+ 按您的位置
+ 如果您当前位于特定位置则触发。有助于避免在家中或办公室时触发某些筛选条件
+ 按标签
+ 如果设备具有选定的标签则触发
+
+
+ 新建
+ 已启用
+ 未启用
+ 雷达提醒可帮助您检测特定设备。当附近设备匹配您的某条提醒规则时,应用会通知您。点击"新建"或选择模板来设置您的第一条规则。
+
+
+ 雷达提醒
+ 名称
+ 描述(可选)
+ 已启用
+ 提醒冷却时间
+ 设置提醒规则触发后的冷却时间,以避免重复通知。
+ 添加筛选条件
+ 未知筛选条件
+ 最短跟随时长
+ 检测最小间隔
+ 防止此提醒规则在选定时间段内对同一设备触发多次。有助于避免频繁通知。
+ 时:分
+ 当前筛选条件不受您的应用版本支持
+ 设备名称(或正则表达式)
+ 忽略大小写
+ 邮箱/电话
+ 最短失联时间
+ 由于 Apple 每 15 分钟更换一次 BLE 地址,AirDrop 无法与特定设备关联。要选择最短失联时间,请使用此字段。
+ 选择设备
+ 点击选择
+ 选择时间
+ 开始日期
+ 开始时间
+ 结束日期
+ 结束时间
+ 已收藏
+ 已配对
+ 位置不可用时跳过此筛选条件(否则默认值为 false)
+ 更改
+ 无法保存提醒规则。请确保您的设置正确。
+ 您的提醒规则已删除。
+ 确定要删除提醒规则"%s"吗?
+ 您的更改将会丢失。继续?
+ 留在页面
+ 放弃更改
+ 已选择位置。半径:%.1f 米
+ 选择目标位置
+ 选择标签
+ STP
+ RST
+ NRP
+ RPA
+
+ 静态公共地址(可被追踪)
+ 随机静态地址(追踪受限)
+ 不可解析私有地址(通常不可追踪)
+ 可解析私有地址(通常不可追踪)
+ 部分设备会轮换地址以保持隐私并避免被追踪。此标签并非十分准确,但可能有助于区分隐私级别。
+
+
+ 自定义筛选
+ 创建筛选
+ 筛选条件无效
+ 搜索关键词或正则表达式
+ 关闭搜索
+ 清除搜索
+ 非 Apple
+ 收藏
+ 您喜欢这个应用吗?
+ 喜欢
+ 不太喜欢
+ 稍后再问
+ 很高兴听到这个评价,能给应用打个分吗?
+ GitHub
+ 很抱歉给您带来不好的体验。您可以在 GitHub Issues 中提供反馈
+ 您周围的设备
+ 尚未发现任何设备
+ 发现的设备中没有符合筛选条件的
+
+
+ 设备详情
+ 未收藏
+ 名称
+ 设备类型
+ 不适用
+ 地址
+ 制造商
+ 检测次数:
+ 首次检测
+ 末次检测
+ %s(已选择)
+ 更改位置历史时间段
+ "历史时间段:%s"
+ 显示大量位置历史记录可能影响地图性能
+ 该时间段内无位置历史记录
+ 一天
+ 一周
+ 一个月
+ 全部时间
+ 历史样式
+ 标记点
+ 路径
+ 隐藏标记
+ 范围热力图
+ %s 前
+ 存在时长:%1$s | 上次更新:%2$s 前
+ 存在时长:%1$s
+ 暂无数据。点击扫描按钮开始扫描
+ 标签名称
+ 新建
+ 添加标签
+ 删除标签"%s"?
+ 离线模式下地图不可用。要查看地图,请先关闭离线模式。
+ %s dBm
+ %s 米
+ 免责声明
+ 到设备的距离基于 RSSI 值计算,并不准确
+ 排序方式
+ 默认
+ 距离
+ 设备类型
+ 显示全部 %s 台在线设备
+ 在线
+
+ - 未发现服务
+ - 发现 %d 项服务
+ - 发现 %d 项服务
+
+
+ - 无原始数据片段
+ - %d 个原始数据片段
+ - %d 个原始数据片段
+
+ 连接中
+ 已连接
+ 断开中
+ 已断开
+ 连接
+ 断开
+ 读取
+ 元数据
+ 展开地图
+ 地图免责声明
+ 地图不显示设备的实际位置;它仅记录您的智能手机在扫描时刻的坐标。位置标记反映的是设备被检测到的地点,而非设备真实所在。地图并非用于定位设备,而是展示它们之前在何处被观测到,以及它们的移动与您自身移动的关联。
+
+
+ 设备列表
+ 雷达提醒
+ 日志
+ 设置
+ 停止
+ 扫描
+ 刷新
+
+
+ 无法启动扫描服务。
+ BLE 扫描器已启动,但暂无数据
+ 周围有 %s 台已知设备
+ 周围共有 %s 台设备
+ 周围没有已知设备
+ @string/app_name
+ %s · 省电模式
+ 检测到匹配"%s"的设备在附近!
+
+
+ - %d 台设备匹配您的提醒规则,就在附近!
+ - %d 台设备匹配您的提醒规则,就在附近!
+ - %d 台设备匹配您的提醒规则,就在附近!
+ - %d 台设备匹配您的提醒规则,就在附近!
+
+
+ "\"%s\"台设备匹配!"
+ 后台扫描服务通知
+ 雷达通知
+ 位置已关闭
+ 由于 Android 系统限制,位置关闭时蓝牙雷达无法扫描
+ 错误通知
+ 蓝牙不可用
+ 看起来蓝牙已关闭或您的设备不支持蓝牙。请开启蓝牙以继续
+ 未授予后台位置权限
+ 后台定位受限
+ 由于 Android 系统限制,需要始终允许位置权限才能在后台扫描 BLE。
+ 了解更多
+ 隐藏
+
+
+ 该设备已从数据库中移除
+ 提醒规则已触发:"%s"
+ %s(已删除)
+ 未知
+ 这是您的事件日志。所有触发的提醒和应用事件都会记录在这里,让您不会错过任何内容。
+
+
+ 申请后台位置权限有两个原因:\n- 部分功能与分析用户当前位置的数据相关。\n- 在 Android 上要在后台正常使用蓝牙,也需要位置权限。
+ 后台位置
+ 附近设备(蓝牙)访问权限
+ 蓝牙扫描需要附近设备(蓝牙)权限。
+ 休眠模式(可选)
+ Android 会限制后台的某些进程。需要此权限以提高后台扫描器的稳定性。可选。
+ 本应用不收集或传输任何数据。项目完全开源,可在 GitHub 上查看
+ 手动授予必要的权限
+ 无法打开该链接
+
+
+ Shaders test
+ Glass scale: %d\%%
+ Aberration index: %.2f
+ Refraction index: %.2f
+ Blur radius: %.2f
+ Glass type
+ Curved
+ Fluted
+ Flat
+ Curve amplitude: %.2f
+ Curve length: %.2f
+ x: %.2f\ny: %.2f
+
+
+ 为什么需要始终允许位置权限
+ 我们的应用使用低功耗蓝牙(BLE)来提供核心功能。根据 Android 政策,BLE 访问需要位置权限,因为您的位置可以从附近的 BLE 和 WiFi 信号推断出来。\n\n虽然仅在使用应用时允许位置访问也能正常工作,但授予始终允许位置访问可确保即使应用在后台运行时 BLE 扫描也不中断。否则,Android 系统可能会限制或阻止 BLE 访问,从而影响应用功能。\n\n我们尊重您的隐私,仅将位置权限用于 BLE 扫描,以使应用无缝运行。应用不会通过互联网传输您的数据,所有信息都安全地存储在您的设备本地。
+ 授予权限
+ © OpenStreetMap
+
+ 已配对
+ 设备已配对
+
+ 本项目仅用于教育、安全研究和个人调查目的。作者不认可或鼓励将本软件用于任何非法或不道德的活动。您需自行负责确保使用本工具时遵守所有适用的法律法规。
+
+ 这个应用是做什么的
+ 低功耗蓝牙(BLE)是一种广泛使用的无线协议,为您周围的各种设备提供支持——从耳机、智能手表、健身追踪器到 AirTag、物联网设备、游戏控制器,甚至现代情趣用品。BLE 设备通过广播小型数据包进行通信,其中可能包含设备标识符、元数据和其他连接所需的信息。\n\n这些广播虽然对设备功能至关重要,但也可能被用来追踪您的存在和行动。例如,一副廉价的无线耳机可能会公开暴露一个持久标识符。任何在附近监听 BLE 数据包的人——无论是政府、公司还是恶意行为者——都可能在未经您同意的情况下利用这些信息追踪您。\n\n幸运的是,许多现代设备在 BLE 中实现了隐私功能以防止追踪,例如随机化地址和有限广播。BLE Radar 帮助您区分保护您隐私的设备和可能被追踪的设备。通过分析您周围的 BLE 流量,应用让您了解哪些设备可以安全使用。\n\n除了分析之外,BLE Radar 还可以实时保护您。当可疑设备在附近或某台设备随您移动一段时间时,应用可以提醒您,让您对潜在的跟踪或不必要的追踪获得早期预警。您可以根据设备标识符、类型或行为配置提醒,以满足您的安全需求。\n\n开发这个应用的目标是让您能够了解和控制环境中的 BLE 设备。了解哪些设备正在广播可追踪信息、哪些注重隐私,能让您对日常使用、佩戴和交互的设备做出明智的决定。
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e3b993d5..0d21d0ea 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -105,6 +105,13 @@
Devices records: %s
Location records: %s
App settings
+ Language
+ App language
+ System default
+ English
+ 中文
+ Magyar
+ Русский
Offline mode is turned off. You can change it in the settings.
Deep analysis (Experimental)
If Deep Analysis is enabled, the app will request more information from all found devices. It will provide more data for each scan, but will also increase scan time and power consumption and may disclose your presence.
diff --git a/metadata/zh-CN/full_description.txt b/metadata/zh-CN/full_description.txt
new file mode 100644
index 00000000..2ffde1d1
--- /dev/null
+++ b/metadata/zh-CN/full_description.txt
@@ -0,0 +1,22 @@
+免责声明:本项目仅用于教育、安全研究和个人调查目的。作者不认可或鼓励将本软件用于任何非法或不道德的活动。您需自行负责确保使用本工具时遵守所有适用的法律法规。
+
+低功耗蓝牙(BLE)是一种广泛使用的无线协议,为您周围的各种设备提供支持——从耳机、智能手表、健身追踪器到 AirTag、物联网设备、游戏控制器,甚至现代情趣用品。BLE 设备通过广播小型数据包进行通信,其中可能包含设备标识符、元数据和其他连接所需的信息。
+
+这些广播虽然对设备功能至关重要,但也可能被用来追踪您的存在和行动。例如,一副廉价的无线耳机可能会公开暴露一个持久标识符。任何在附近监听 BLE 数据包的人——无论是政府、公司还是恶意行为者——都可能在未经您同意的情况下利用这些信息追踪您。
+
+幸运的是,许多现代设备在 BLE 中实现了隐私功能以防止追踪,例如随机化地址和有限广播。BLE Radar 帮助您区分保护您隐私的设备和可能被追踪的设备。通过分析您周围的 BLE 流量,应用让您了解哪些设备可以安全使用。
+
+除了分析之外,BLE Radar 还可以实时保护您。当可疑设备在附近或某台设备随您移动一段时间时,应用可以提醒您,让您对潜在的跟踪或不必要的追踪获得早期预警。您可以根据设备标识符、类型或行为配置提醒,以满足您的安全需求。
+
+开发这个应用的目标是让您能够了解和控制环境中的 BLE 设备。了解哪些设备正在广播可追踪信息、哪些注重隐私,能让您对日常使用、佩戴和交互的设备做出明智的决定。
+
+应用主要功能:
+
+* 扫描、分析和跟踪周围的蓝牙设备;
+* 为雷达创建灵活的筛选条件;
+* 对扫描到的 BLE 设备进行深度分析,从可用的 GATT 服务获取数据;
+* GATT 服务浏览器;
+* 通过元数据识别设备类型;
+* 估算到设备的大致距离。
+
+Bluetooth Radar 不会收集或发送您的个人或地理位置数据。项目完全开源,可在 GitHub 上获取。
diff --git a/metadata/zh-CN/images/featureGraphic.png b/metadata/zh-CN/images/featureGraphic.png
new file mode 100644
index 00000000..f42e15c9
Binary files /dev/null and b/metadata/zh-CN/images/featureGraphic.png differ
diff --git a/metadata/zh-CN/images/header.png b/metadata/zh-CN/images/header.png
new file mode 100644
index 00000000..f42e15c9
Binary files /dev/null and b/metadata/zh-CN/images/header.png differ
diff --git a/metadata/zh-CN/images/ic_launcher-playstore.png b/metadata/zh-CN/images/ic_launcher-playstore.png
new file mode 100644
index 00000000..e4c8575a
Binary files /dev/null and b/metadata/zh-CN/images/ic_launcher-playstore.png differ
diff --git a/metadata/zh-CN/images/ic_launcher_background.webp b/metadata/zh-CN/images/ic_launcher_background.webp
new file mode 100644
index 00000000..ec49c5d5
Binary files /dev/null and b/metadata/zh-CN/images/ic_launcher_background.webp differ
diff --git a/metadata/zh-CN/images/icon.png b/metadata/zh-CN/images/icon.png
new file mode 100644
index 00000000..e4c8575a
Binary files /dev/null and b/metadata/zh-CN/images/icon.png differ
diff --git a/metadata/zh-CN/images/phoneScreenshots/Screenshot_1.png b/metadata/zh-CN/images/phoneScreenshots/Screenshot_1.png
new file mode 100644
index 00000000..66cef285
Binary files /dev/null and b/metadata/zh-CN/images/phoneScreenshots/Screenshot_1.png differ
diff --git a/metadata/zh-CN/images/phoneScreenshots/Screenshot_2.png b/metadata/zh-CN/images/phoneScreenshots/Screenshot_2.png
new file mode 100644
index 00000000..0c092c17
Binary files /dev/null and b/metadata/zh-CN/images/phoneScreenshots/Screenshot_2.png differ
diff --git a/metadata/zh-CN/images/phoneScreenshots/Screenshot_3.png b/metadata/zh-CN/images/phoneScreenshots/Screenshot_3.png
new file mode 100644
index 00000000..bc77634a
Binary files /dev/null and b/metadata/zh-CN/images/phoneScreenshots/Screenshot_3.png differ
diff --git a/metadata/zh-CN/images/phoneScreenshots/Screenshot_4.png b/metadata/zh-CN/images/phoneScreenshots/Screenshot_4.png
new file mode 100644
index 00000000..5eeeacbf
Binary files /dev/null and b/metadata/zh-CN/images/phoneScreenshots/Screenshot_4.png differ
diff --git a/metadata/zh-CN/images/phoneScreenshots/Screenshot_5.png b/metadata/zh-CN/images/phoneScreenshots/Screenshot_5.png
new file mode 100644
index 00000000..a4e5d3af
Binary files /dev/null and b/metadata/zh-CN/images/phoneScreenshots/Screenshot_5.png differ
diff --git a/metadata/zh-CN/images/phoneScreenshots/Screenshot_6.png b/metadata/zh-CN/images/phoneScreenshots/Screenshot_6.png
new file mode 100644
index 00000000..0e832724
Binary files /dev/null and b/metadata/zh-CN/images/phoneScreenshots/Screenshot_6.png differ
diff --git a/metadata/zh-CN/images/phoneScreenshots/Screenshot_7.png b/metadata/zh-CN/images/phoneScreenshots/Screenshot_7.png
new file mode 100644
index 00000000..4660b11f
Binary files /dev/null and b/metadata/zh-CN/images/phoneScreenshots/Screenshot_7.png differ
diff --git a/metadata/zh-CN/images/phoneScreenshots/Screenshot_8.png b/metadata/zh-CN/images/phoneScreenshots/Screenshot_8.png
new file mode 100644
index 00000000..beaf5c2f
Binary files /dev/null and b/metadata/zh-CN/images/phoneScreenshots/Screenshot_8.png differ
diff --git a/metadata/zh-CN/short_description.txt b/metadata/zh-CN/short_description.txt
new file mode 100644
index 00000000..d4f80adc
--- /dev/null
+++ b/metadata/zh-CN/short_description.txt
@@ -0,0 +1 @@
+一款用于监控、分析和发现周围 BLE 设备的工具。
diff --git a/metadata/zh-CN/title.txt b/metadata/zh-CN/title.txt
new file mode 100644
index 00000000..136382e1
--- /dev/null
+++ b/metadata/zh-CN/title.txt
@@ -0,0 +1 @@
+BLE Radar