-
-
Notifications
You must be signed in to change notification settings - Fork 377
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
移除「外部儲存空間的權限和存取權」 #1186
Comments
@goofyz 使用 App 私有目录我曾经做过,理论上还是很可行的。不过有如下一些顾虑: 摒弃传统存储访问方式,也就是通过 URI 读写(实际原理是通过 Android 的存储访问框架(Storage Access Framework,SAF)进行)。由于同文的后端库 librime 只支持传统的文件系统方式,曾经想过三种方式:
综合来看,第三种方式,也就是我们目前讨论的方式是最合适的。另外,从外部复制同步我也想过,但是显然不太优雅,而且会增加潜在工作量。所以我觉得最佳实践是参照 fcitx5-android 的做法,实现数据导入导出的功能;同时我们也能增加清空 build 的功能等。这样也符合主流做法。 最后回答一下提出的两个问题:
|
方案 3 如何實現檔案導入? |
DocumentProvider 是一个定义对应用私有存储目录访问方式的工具。Android 11+ 无法直接访问 Android/data 来访问应用私有目录,DocumentProvider 就是来解决应用数据对外交互的需求的。目前质感文件和 MT 管理器都可以利用它来访问应用私有目录(如果应用有 DocumentProvider 的话)。 数据导入/导出,导入可以从外部存储选择压缩包,让应用解压到用户资料夹去;导出则反向操作。 |
用f5a的做法好像没啥问题。 |
看了 f5a 的作法,是直接使用私有目錄,似乎跟我的建議分別只是一開始如何置入 rime 文件。
基於以上原因,我還是認為我的建議比只使用私有目錄好。 |
@goofyz MT 管理器和质感文件是我所知的同文用户中(QQ 社群)最常用的文件管理器,还有 NMM 等,这些文件管理器都支持添加存储,特别是可以添加 引导开发者尽量使用应用内置存储、内置存储数据随应用卸载删除都是 Google 指定的规范,这也是为了应用在被卸载后不会在外置存储内留下“屎山”,这些和 iOS 上的情况其实是异曲同工的。我倾向于在遵守这些规范的前提下尽可能增强围绕前增强应用能力。个人建议是有更清晰的文档来引导用户如何管理这些配置,并逐渐增强同文本身对数据的管理能力(比如细分出更多种类的数据导入,开放管理方案、词典的用户界面等)。 |
@goofyz 另外我们的应用是最低兼容 Android 5.0 的,Android 小于等于 9.0 的版本仍然需要外置存储权限,Android 10 是过渡版本。可以要也可以不要(不要的话则通过 MediaStore API 访问),Android 11 起强制使用分区存储,无权限只可使用 MediaStore API 访问外置存储。 |
|
想深一層,要「使用者自行操作資料夾」還是落了下乘。如果 Trime 有 UI 去下載輸入法、修改設定和鍵盤的話, 新手可以輕鬆使用,老手可以在私有目錄細緻修改,就不會有這串討論了。 |
这样就需要联网权限了 |
@goofyz 我还是觉得从外面一遍遍复制很奇怪 …… 需要更多讨论 |
可以以第三方软件的形式来提供给新手可视化选择下载部署方案。只需要trime暴露私有目录允许其他软件读写就可以了。包括词库云端同步也可以靠第三方软件去读写同步 |
Android 10还能把数据放 外置内存卡(插在手机上的TF储存卡)上,13就不能存在外置的TF卡上了,如果选了非data的目录部署会报错闪退,data里又看不到所以不能选。对应的机器分别是xperia xz2和1 iii,其他输入法如Microsoft SwiftKey、Google Gboard输入中文又很难受。 更新:直接把TF内存卡格式化成内置的 Emulated storage 就完事了,ADB命令执行完还要在系统设置里迁移一下才可以,以前竟然不知道唉(内存卡要足够快,我的是samsung Pro plus 2023,这张卡4k小文件读和写都在10MB/s以上) |
@goofyz 我认真想了一段时间,觉得你的建议还是很合理的。我还是赞成你的方案 ~ |
在 PC 上,我 rime 的配置在 |
若有需要的話,可以加個 broadcast 指令去將檔案覆製到 |
最近正在實作此功能,發現原來 rime/trime 會修改 |
👍
termux 也提供给了文件管理器一个 |
現在已經有呀 |
trime 目前会在 |
@goofyz 我有点想仿照 https://github.com/YuriSizuku/android-SafFile 写一个钩子来让 librime 可以通过 SAF 读写文件 |
不會更易有 bug 嗎? 😁 就是擔心讀寫速度會受到大影響。 |
是的。这只是从技术上看着很酷 …… |
背景
為解決「權限 」的問題 (#997 ),研究了一會 Android 的scoped storage framework 。
我們可以使用
ACTION_OPEN_DOCUMENT_TREE
來拿取某目錄 (/rime
) 的權限。不過就算拿到權限,也不能直接使用File()
來讀取,而必須便用Uri
。由於 rime 不能用Uri
來部署,所以我們需要另一處可以直接讀寫的目錄。而 Android 中的程式都有各自的 app-specific directory。此目錄:
建議
我建議將 rime 需要用到的檔案搬到 "app-specific directory" (
/sdcard/Android/data/com.osfans.trime
) 來使用。具體步驟為:/sdcard/rime
)(可以選取其他目錄)/sdcard/Android/data/com.osfans.trime/build
這樣對用戶和開發者而言,改動最少而又能做到現在一樣的功能。大家覺得如何?
其他考慮
/build
來除蟲,用 external storage 來做 app-specific directory 會好一點。題外話又有少許相關的問題
參考:
https://developer.android.com/training/data-storage/shared/documents-files#grant-access-directory,
The text was updated successfully, but these errors were encountered: