簡體   English   中英

我可以使用 ActivityResultContracts.GetContent() 中的 URI 多長時間?

[英]How long can I use the URI from ActivityResultContracts.GetContent() for?

基本上,我試圖讓用戶從他們手機的圖片庫中選擇圖片作為我的應用程序中的背景圖片。

這是我的代碼:

private val pickImages = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
    // e.g. content://com.android.providers.media.documents/document/image%3A31
    android.util.Log.d("dev-", "uri = $uri?.toString()")
    uri?.let {
        // save uri to my DB, etc.
    }
}

我擔心的是:如果用戶刪除圖像或切換到新手機會發生什么。 URI 應該中斷,對吧? 更好的方法是將圖片保存到我的本地應用程序存儲並保存指向那里的 URI?

但是,我嘗試從手機圖庫中刪除圖片,重置圖庫緩存,關閉並重新打開應用程序,重新啟動手機......我仍然可以在我的應用程序中使用圖像。

真的有必要創建我自己的文件副本嗎?

registerForActivityResult(ActivityResultContracts.GetContent())給我的 URI 能持續多久?

我在CommonsWare上找到了這篇SO 帖子和這篇文章,但網上沒有其他內容,而且我還沒有遇到任何錯誤......

注意:我一直在測試 Android 12 API 31。

更新

我終於找到了回答我問題的官方文檔

當您的應用打開文件進行讀取或寫入時,系統會為您的應用授予該文件的 URI 權限授予,該權限將持續到用戶的設備重新啟動。

我擔心的是:如果用戶刪除圖像或切換到新手機會發生什么。 URI 應該中斷,對吧?

通常它會。 更重要的是,一旦您的應用進程終止,您可能無法使用該Uri

但是,我嘗試從手機圖庫中刪除圖片,重置圖庫緩存,關閉並重新打開應用程序,重新啟動手機......我仍然可以在我的應用程序中使用圖像。

您不應假設它適用於所有 Android 操作系統版本、Android 設備型號、圖庫應用程序等。您似乎已經在數以萬計的設備型號上進行了測試,使用的操作系統版本目前由用戶群的一小部分。

如果,OTOH,你是你的應用程序的唯一用戶,並且只在這個設備上,歡迎你做任何你想做的事情。

真的有必要創建我自己的文件副本嗎?

這取決於你的目標。

您可以使用OpenDocument代替GetContent ,並使用takePersistableUriPermission()來獲得對該內容的長期訪問。 這是“附加”操作:您希望將內容附加到您的應用程序,但您很樂意讓外部工具管理該內容。 這處理進程被終止的場景和電話被重新啟動的場景。 它不處理 user-nuked-the-content-from-orbit 場景、user-modified-the-content 場景等。

如果您需要訪問內容而不考慮外部用戶操作,請制作該內容的副本。 這是“導入”操作:您希望內容的副本由您的應用專門管理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM