FairScan Scan-to-PDF Intent开发指南:让你的应用调用隐私优先的扫描器
【免费下载链接】FairScanAn Android app to scan your documents — simple and respectful项目地址https://gitcode.com/gh_mirrors/fa/FairScan点击查看免费下载FairScan 是一个开源的 Android 文档扫描应用主打「简单、尊重用户」全部图像处理在本地完成无云端、无追踪、无广告。它的 Scan-to-PDF Intent 允许你的应用通过一个隐式 Intent 唤起 FairScan让用户拍完文档后自动收到一个 PDF —— 无需自己写相机、矫正、增强等复杂逻辑。本指南将带你完成从发起调用到接收 PDF 结果的全部步骤。一、为什么选择 FairScan 的扫描 Intent特性说明 隐私优先文档处理 100% 在用户设备本地完成不经过任何云端 输出即所得多页扫描合并为单个 PDF无需手动调整 全自动流水线自动文档检测、透视矫正、图像增强一次完成 标准 Android 机制基于隐式 Intent setResult返回 URI接入成本低⚠️ 注意该特性目前是**实验性experimental**的Intent 契约和行为可能随版本变化不做向后兼容承诺。生产环境接入时建议固定 FairScan 版本并关注更新说明。二、两种调用方式自定义 Intent 与系统选择器FairScan 在 AndroidManifest.xml 中注册了两种入口你可以任选其一方式 1专用自定义 Action推荐Action 为org.fairscan.app.action.SCAN_TO_PDF会直接打开 FairScan 的「外部扫描模式」val intent Intent(org.fairscan.app.action.SCAN_TO_PDF) startActivityForResult(intent, REQUEST_SCAN_TO_PDF)该模式会屏蔽设置页等无关入口用户一进来就是扫描界面体验最聚焦。方式 2标准 GET_CONTENT 系统选择器如果不想绑定特定 App可以让用户从系统选择器中挑任意能产出 PDF 的应用FairScan 已注册application/pdf的 GET_CONTENT 过滤器val intent Intent(Intent.ACTION_GET_CONTENT).apply { type application/pdf addCategory(Intent.CATEGORY_OPENABLE) } startActivityForResult(intent, REQUEST_SCAN_TO_PDF)两种方式最终返回的都是同一个 PDF 结果区别只在入口路径。三、完整接入步骤发起 → 扫描 → 接收 PDFFairScan 的外部模式流程如下FairScan 直接打开扫描模式用户拍摄一页或多页文档处理全部在本地完成检测、矫正、增强生成单个 PDF以Content URI形式通过setResult(RESULT_OK, ...)返回给调用方URI 带有FLAG_GRANT_READ_URI_PERMISSION读权限且生命周期有限接收并立即保存 PDFoverride fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode REQUEST_SCAN_TO_PDF resultCode RESULT_OK) { data?.data?.let { uri - lifecycleScope.launch(Dispatchers.IO) { val target File(filesDir, scanned.pdf) contentResolver.openInputStream(uri)?.use { input - target.outputStream().use { input.copyTo(it) } } } } } }检测 FairScan 是否已安装调用前建议先检查避免ActivityNotFoundException并提供降级方案val installed packageManager.queryIntentActivities( Intent(org.fairscan.app.action.SCAN_TO_PDF), 0 ).isNotEmpty()四、关键细节为什么必须立即拷贝 URI这是接入时最容易踩的坑也是官方 README 明确强调的契约返回的 URI 有效期有限FairScan 之后会删除文件调用方应立即拷贝 URI 内容。从源码可以清楚看到原因每次外部调用都会创建一个独立的临时会话目录cacheDir/sessions/uuid见 SessionViewModel.kt会话结束时该目录被递归删除避免临时文件残留、保护用户隐私见 SessionViewModel.kt还有孤儿会话清理逻辑兜底见 FairScanApp.ktPDF 通过FileProvider以 content URI 安全共享authority 为包名.fileprovider见 FileUris.kt 与 file_paths.xml 因此不要只保存 URI要立刻把内容拷贝到你的私有目录。五、用户取消与异常处理外部模式下的返回码约定场景结果码用户完成扫描并导出RESULT_OK携带 PDF URI用户在扫描页按返回键取消RESULT_CANCELED设备未安装 FairScanstartActivityForResult抛ActivityNotFoundException取消逻辑在 MainActivity.kt 中实现外部模式下在相机页按返回即返回RESULT_CANCELED。建议对「用户取消」静默处理对异常记录日志并提示用户。六、源码速览外部模式是如何工作的对源码感兴趣的同学可以看这几个关键位置入口判定MainActivity.kt 的resolveLaunchMode根据 action 区分正常模式与外部扫描模式模式枚举定义在 LaunchMode.kt导出逻辑外部调用的 PDF 由 ExportViewModel.kt 的generatePdfForExternalCall生成 —— 采用 BALANCED 质量、跳过 OCR并按用户默认文件命名风格命名后加.pdf结果回传MainActivity.kt 的sendActivityResult用ClipData.newRawUri 读权限标志构造返回 Intent行为测试NavigationTest.kt 覆盖了外部调用的导航行为七、最佳实践清单 ✅ 调用前用queryIntentActivities检测安装情况未安装时提供降级方案引导用户安装或改用其他方式✅ 收到 URI 后同步立即拷贝内容绝不只存 URI✅ 用startActivityForResult或 Activity Result API而非startActivity否则拿不到结果✅ 对实验性契约做版本隔离将 FairScan 相关逻辑封装在独立模块/类中方便未来契约变更时集中修改✅ 用户未安装 FairScan 时可用方式 2 的 GET_CONTENT 作为通用兜底只要完成以上步骤你的应用就获得了一个开箱即用、隐私友好的「拍照 → PDF」能力而文档检测与图像处理的复杂度全部由 FairScan 承担。赞分享【免费下载链接】FairScanAn Android app to scan your documents — simple and respectful项目地址https://gitcode.com/gh_mirrors/fa/FairScan点击查看免费下载相关推荐开源文档扫描神器OpenScan你的隐私友好型扫描助手你是否曾经为扫描纸质文档而烦恼在数据隐私日益重要的今天OpenScan为你提供了一个完美的解决方案。这款开源文档扫描应用不仅功能强大更重要的是它真正尊重你MPD客户端开发入门从零开始构建跨平台音乐控制应用MPD客户端开发入门从零开始构建跨平台音乐控制应用 MPDMusic Player Daemon是一款功能强大的音乐播放守护进程它允许你通过网络控制音乐音视频后端OpenTracks隐私优先的开源运动跟踪应用终极指南OpenTracks隐私优先的开源运动跟踪应用终极指南 OpenTracks是一款完全尊重用户隐私的开源运动跟踪应用专为Android设备设计。这款免费的运移动开发智能硬件上一篇NVIDIA Profile Inspector深度解析显卡性能调优的底层机制与实践方案下一篇JDspyder京东抢购脚本3分钟快速部署告别手动抢购的烦恼创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考