基本上,我試圖讓用戶從他們手機的圖片庫中選擇圖片作為我的應用程式中的背景圖片。
這是我的代碼:
private val pickImages = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
// e.g. content://com.android.providers.media.documents/document/image:31
android.util.Log.d("dev-", "uri = $uri?.toString()")
uri?.let {
// save uri to my DB, etc.
}
}
我擔心的是:如果用戶洗掉影像或切換到新手機會發生什么。URI 應該中斷,對吧?更好的方法是將圖片保存到我的本地應用程式存盤并保存指向那里的 URI?
但是,我嘗試從手機圖庫中洗掉圖片,重置圖庫快取,關閉并重新打開應用程式,重新啟動手機......我仍然可以在我的應用程式中使用圖片。
真的有必要創建我自己的檔案副本嗎?
我得到的 URIregisterForActivityResult(ActivityResultContracts.GetContent())持續多久?
我在CommonsWare上找到了這篇SO 帖子和這篇文章,但網上沒有其他內容,而且我還沒有遇到任何錯誤......
注意:我一直在測驗 Android 12 API 31。
uj5u.com熱心網友回復:
我擔心的是:如果用戶洗掉影像或切換到新手機會發生什么。URI 應該中斷,對吧?
通常它會。Uri更重要的是,一旦您的應用行程終止,您可能無法使用它。
但是,我嘗試從手機圖庫中洗掉圖片,重置圖庫快取,關閉并重新打開應用程式,重新啟動手機......我仍然可以在我的應用程式中使用圖片。
您不應假設它適用于所有 Android 作業系統版本、Android 設備型號、圖庫應用程式等。您似乎已經在數以萬計的設備型號上進行了測驗,使用的作業系統版本目前由用戶群的一小部分。
如果,OTOH,你是你的應用程式的唯一用戶,并且只在這個設備上,歡迎你做任何你想做的事情。
真的有必要創建我自己的檔案副本嗎?
這取決于你的目標。
您可以使用OpenDocument代替GetContent,并使用takePersistableUriPermission()來獲得對該內容的長期訪問。這是“附加”操作:您希望將內容附加到您的應用程式,但您很樂意讓外部工具管理該內容。這處理行程被終止的場景和電話被重新啟動的場景。它不處理 user-nuked-the-content-from-orbit 場景、user-modified-the-content 場景等。
如果您需要訪問內容而不考慮外部用戶操作,請制作該內容的副本。這是“匯入”操作:您希望內容的副本由您的應用專門管理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/455797.html
