# 权限、系统能力与可访问性

星线按扫码、通话、城市识别、实时位置和文件操作分别接入系统能力。本文列明源码声明及触发路径，并说明现有可访问性实现与验收范围。

## iOS 权限与能力

| 能力 | 触发与用途 |
| --- | --- |
| 相机 | 扫码、拍摄和视频通话，在对应路径请求视频访问 |
| 麦克风 | 发起或接入音视频通话时请求音频访问 |
| 使用期间定位 | 城市贴纸、位置选择、附近地点及用户确认后的实时共享 |
| 文件与照片选择 | 使用系统选择器读取用户明确选中的项目 |

`Info.plist` 和 `project.yml` 提供相机、麦克风、使用期间定位说明；后台模式声明 location、audio、voip。城市识别只发起一次前台请求，实时共享在用户开启后才允许后台定位，结束时关闭后台更新。声明后台模式本身不会让共享自动开始。

扫码检查 `DataScannerViewController.isSupported` 和 `isAvailable`。相机不可用或未授权时保留照片选择、粘贴内容和系统设置入口；相册使用 `PhotosPicker`，文件使用 `fileImporter`，不要求扫描整个照片库。通话分别处理麦克风与摄像头授权，视频开关会检查摄像头访问。

系统来电桥接使用 CallKit/PushKit，APNs entitlement 根据 Debug/Release 注入 development/production 环境。推送凭据、服务和描述文件是否可用，需要独立验收，不能由 entitlement 存在推断后台来电已交付。

## Android 清单与运行时请求

清单声明 INTERNET、CAMERA、RECORD_AUDIO、MODIFY_AUDIO_SETTINGS、ACCESS_NETWORK_STATE、FINE/COARSE_LOCATION、FOREGROUND_SERVICE、FOREGROUND_SERVICE_LOCATION 和 POST_NOTIFICATIONS。其中敏感权限还需运行时获得用户授权。

扫码相机进入页面后请求 CAMERA，CameraX 随生命周期绑定与释放；拒绝后仍可选择图片或粘贴。通话依据接听、入会、开麦或开摄像头动作请求所需权限，支持视频通话的仅音频加入路径。

城市贴纸优先使用已获得的 COARSE_LOCATION，界面提供主动授权按钮；即使没有定位权限也可用 IP 粗略城市或手选。实时共享同时处理精确／粗略位置，以及 Android 13 及以上的通知权限，再启动带持续通知的定位前台服务。清单没有申请 ACCESS_BACKGROUND_LOCATION；前台服务的系统限制和厂商后台策略仍需真机检查。

应用关闭系统自动备份，Release 禁止明文网络，Debug 单独允许本地联调。FileProvider 不对外导出组件，只向选中的接收应用授予临时 URI 权限。文件选择通过系统文档选择器读取指定内容，没有请求广泛存储访问。相关数据边界见[安全与隐私](https://document.thestarline.cn/app/security-and-privacy.md)。

## 拒绝、撤权与替代路径

| 场景 | iOS 当前行为 | Android 当前行为 |
| --- | --- | --- |
| 扫码相机拒绝 | 保留照片／粘贴，显示系统设置入口 | 相机区域可再次申请，照片／粘贴仍可用；永久拒绝后不能假设重按必有弹窗 |
| 扫描硬件不支持 | VisionKit 能力检查后显示替代入口 | CameraX 初始化失败显示错误，不把取景框存在算识别可用 |
| 通话麦克风拒绝 | 准备媒体阶段报错，不能正常发布音频 | 动作提示所需权限，可重新授权 |
| 视频摄像头拒绝 | 摄像头状态保持关闭，不能声称发送视频 | 视频发起要求相机；来电／加入可选择仅音频路径 |
| 城市粗略位置未授权 | 单次请求可能触发授权；失败保留 IP 与手选 | 不强制先授予精确定位，用户可主动申请粗略位置 |
| 实时位置所需通知拒绝 | 不适用 Android 通知前台服务门槛 | Android 13及以上通知未授权时不开始持续共享 |
| 共享中撤销位置 | 停本机位置更新，页面须呈现最后更新时间 | 前台服务停采集并提示处理原有共享；不等于服务器已删除旧坐标 |
| 文件或照片选择取消 | 不添加本次项目 | 不添加本次项目 |

权限“已拒绝”和系统定位／相机服务关闭不同；同一个按钮重新点击也不能替代前往系统设置。普通文件选择、附件预览和 JSON 转出也属于不同授权范围：选择输入文件不表示允许读取整个目录，授予 FileProvider 读权限不表示接收应用不能复制内容，选择转出目标可能涉及用户所选云盘。详细明文和清理边界见[记忆转出](https://document.thestarline.cn/app/memory-export.md)。

回归按以下顺序记录：在明确的初始权限下进入功能；拒绝并确认替代入口；到系统设置改变权限后回前台；重新触发；进行中再次撤权；最后退出页面和进程，检查资源释放及服务器状态。不得为了截图统一清除已有 App 数据，测试夹具和权限状态应使用专用设备或明确授权的范围。

## 已有可访问性实现

iOS 为扫码、记忆操作、任务完成、名片和消息等提供语义标签或提示；部分纯装饰插画隐藏于辅助技术。任务筛选在辅助功能大字号下由横排改为纵排；新事及个人页读取 Reduce Motion，减少过渡动画。测试使用的 `accessibilityIdentifier` 是定位标识，不能替代用户能听到的 `accessibilityLabel`。

Android 底部导航提供 `Role.Tab` 与导航描述，设置开关使用 Switch 语义，任务操作描述包含目标任务。通话状态和错误使用 polite live region；装饰插画移除语义，动作图标提供中文描述。主要工具栏动作采用 48dp 点击区域；插画与页面过渡读取系统动画时长开关，关闭动画时使用静态状态。

## 扩展与验收

新增能力应将用途说明、运行时请求、拒绝后的可用路径和资源释放放在同一功能中检查。新增图标沿用已有矢量体系，统一尺寸、线宽和语义颜色；功能名称由标签表达，装饰图不重复播报。布局需检查窄屏、键盘弹出、较大字体、长文件名和多行内容的实际摆放。

本篇依据源码，不宣称已通过完整 VoiceOver、TalkBack、大字号、对比度或无障碍合规认证。本轮未操作设备。回归需覆盖首次允许、拒绝、永久拒绝、系统设置撤权、前后台切换与进程恢复，并实际检查焦点顺序、朗读、触控区域及动画关闭后的状态，见[测试](https://document.thestarline.cn/app/testing.md)。源码入口为 iOS `ScannerView/ChatCallCoordinator/ChatLiveLocation/TaskListView` 与 Android `ScanCameraPreview/CallScreen/LiveLocationPanel/VisualArtwork`。城市与医疗的专项边界分别见[城市贴纸](https://document.thestarline.cn/app/city-stickers.md)和[医疗健康记录](https://document.thestarline.cn/app/medical-records.md)。
