-
-
Notifications
You must be signed in to change notification settings - Fork 403
Open
Description
背景
為解決「權限 」的問題 (#997 ),研究了一會 Android 的scoped storage framework 。
我們可以使用 ACTION_OPEN_DOCUMENT_TREE
來拿取某目錄 (/rime
) 的權限。不過就算拿到權限,也不能直接使用 File()
來讀取,而必須便用 Uri
。由於 rime 不能用 Uri
來部署,所以我們需要另一處可以直接讀寫的目錄。
而 Android 中的程式都有各自的 app-specific directory。此目錄:
- 讀寫不需額外權限。
- 會在移除程式後自動刪除。
- 分為 external 和internal storage
- 其他程式不能讀取
建議
我建議將 rime 需要用到的檔案搬到 "app-specific directory" (/sdcard/Android/data/com.osfans.trime
) 來使用。具體步驟為:
- 用戶將相關 schema 檔放在某一目錄 (e.g.
/sdcard/rime
)(可以選取其他目錄) - Trime 第一次啟動時,會問用戶選取 schema 的目錄。用戶揀選後,Trime 可以拿到讀寫權限。該權限會儲存起來,以後使用。
- Trime 會先將第一步的目錄複製到 “app-specific directory ”。
- Trime 用app-specific directory 為 rime 的用戶目錄作部署。
- 成功部署後,build 目錄為
/sdcard/Android/data/com.osfans.trime/build
- 往後每次手動部署時,會重覆 3 - 5 。程式開啟時的話則只需做 4 - 5。
這樣對用戶和開發者而言,改動最少而又能做到現在一樣的功能。大家覺得如何?
其他考慮
- 考慮到現今使用者需要使用
/build
來除蟲,用 external storage 來做 app-specific directory 會好一點。 - 如果 schema directory 的檔案太多太大,複製到app-specific directory 需要的時間會增多,變相部署的時間會延長。
- 由於是複製,會浪費了儲存空間
- 「同步」的話,可以用同一方法拿取目錄權限,將檔案複製出去。
- 將檔案由 app-specific directory 導出到其他目錄的話,有機會不能覆寫現有的檔案。變相「同步」每次都需建立新資料來處理。這部份暫未研究清楚。
題外話又有少許相關的問題
- 「同步」的作用是什麼?現在還有人在用嗎?
- 「共享資料來」的作用是什麼?還有需要嗎?
參考:
https://developer.android.com/training/data-storage/shared/documents-files#grant-access-directory,
hebinhao1993, clover-yan and SunsetMkt