修复 Android 10+ 系统分享界面缺失蓝牙选项的轻量级工具
从 Android 10(API 29)开始,Google 对文件分享机制进行了更严格的限制。许多用户发现,在文件管理器或应用中长按文件选择"分享"时,系统弹出的分享列表中不再显示蓝牙选项,即使设备蓝牙功能完全正常。
这是因为 Android 10+ 引入了 Scoped Storage 和更严格的 FileProvider 权限管理,导致传统的蓝牙分享入口被隐藏或移除,给用户通过蓝牙传输文件(尤其是 APK 安装包)带来了不便。
Bloodtooth 作为一个"中间人"应用,通过以下机制恢复蓝牙分享功能:
- 接收分享 Intent —— 注册为分享目标应用,捕获系统
ACTION_SEND事件 - 权限适配 —— 自动处理 Android 12+ 新增的
BLUETOOTH_CONNECT运行时权限 - 蓝牙状态检测 —— 智能引导用户开启蓝牙(如未开启)
- 文件缓存与转换 —— 将接收到的文件复制到应用缓存目录,并通过
FileProvider生成安全的content://URI - 直接唤起蓝牙传输 —— 绕过系统分享界面,直接调用蓝牙 OPP(Object Push Profile)传输组件
用户选择文件 → 分享到 "Bloodtooth"
↓
[检查蓝牙权限 & 蓝牙状态]
↓
[将文件复制到应用缓存目录]
↓
[通过 FileProvider 生成安全 URI]
↓
[直接启动 BluetoothOppLauncherActivity]
↓
系统蓝牙设备选择界面 → 选择接收方 → 传输完成
↓
[60秒后自动清理缓存文件]
| 技术 | 说明 |
|---|---|
Intent.ACTION_SEND |
作为分享中介接收任意文件类型 |
FileProvider |
解决 Android 7.0+ 的 file:// URI 暴露问题 |
BluetoothOppLauncherActivity |
直接调用系统蓝牙传输组件,绕过分享列表 |
| 动态权限申请 | 适配 Android 6.0+ 运行时权限及 Android 12+ 蓝牙权限 |
| 临时文件管理 | 自动清理机制防止缓存堆积 |
- 安装应用 —— 安装 Bloodtooth APK
- 选择文件 —— 在文件管理器中长按任意文件(支持 APK、图片、文档等)
- 点击分享 —— 选择"分享"按钮
- 选择 Bloodtooth —— 在分享列表中找到并点击"血牙"
- 蓝牙传输 —— 应用自动唤起蓝牙设备选择界面,选择目标设备即可传输
💡 提示:如果蓝牙未开启,应用会自动弹出请求;首次使用需要授予蓝牙连接权限。
- 最低系统:Android 5.0(API 21)
- 目标系统:Android 10+(API 29+ 效果最佳)
- 必要权限:蓝牙、蓝牙连接(Android 12+)、存储访问
<!-- Android 12+ 需要 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- 基础蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />应用使用 com.bloodtooth.bluetooth.fileprovider 作为授权标识,确保生成的 URI 能被系统蓝牙组件安全访问。
- 蓝牙不可用 → 提示并退出
- 权限拒绝 → 引导用户手动开启
- 文件复制失败 → 错误日志 + Toast 提示
- 蓝牙启动失败 → 自动降级到系统分享选择器
MIT License — 自由使用,欢迎贡献代码
Q: 为什么需要复制文件到缓存?
A: Android 10+ 限制了应用间直接访问外部文件,通过复制到应用私有缓存并生成 content:// URI,可以确保蓝牙组件有权限读取文件。
Q: 缓存文件什么时候删除?
A: 文件传输启动后 60 秒自动清理,避免占用存储空间。
Q: 支持哪些文件类型?
A: 理论上支持所有类型,包括 APK、图片、视频、文档等。MIME 类型会自动从原文件继承。
Bloodtooth — 让 Android 蓝牙分享回归简单