Skip to content

移除「外部儲存空間的權限和存取權」 #1186

@goofyz

Description

@goofyz

背景

為解決「權限 」的問題 (#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) 來使用。具體步驟為:

  1. 用戶將相關 schema 檔放在某一目錄 (e.g. /sdcard/rime)(可以選取其他目錄)
  2. Trime 第一次啟動時,會問用戶選取 schema 的目錄。用戶揀選後,Trime 可以拿到讀寫權限。該權限會儲存起來,以後使用。
  3. Trime 會先將第一步的目錄複製到 “app-specific directory ”。
  4. Trime 用app-specific directory 為 rime 的用戶目錄作部署。
  5. 成功部署後,build 目錄為 /sdcard/Android/data/com.osfans.trime/build
  6. 往後每次手動部署時,會重覆 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,

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions