Android 拍照及相冊選取圖片功能,徹底解決 uri 獲取路徑,非真實路徑,無法上傳之問題

liy Elaine
liy Elaine
Published in
Dec 1, 2021

隨著隱私保護的趨勢,Android 新的幾個版本也做了相對應的變更,手機應用程式要取得手機內部的資料,或者是使用者的隱私 位置,需要經過的程序越來越繁瑣,甚至有些讀取程序已不再被允許。

無論是 拍照及或從相冊選取,獲取的 照片檔案 Uri 真實路徑 已不適用

在 Android Q 版本中,由於改變外部文件存取方式,已無法通過 ContentResolver 將照片檔案 Uri轉成真實路徑。或是利用其他方式來轉換真實路徑也越趨困難, App大致上已無法通過獲取照片 Uri 真實路徑來讀取 File。

MediaStore 介面 DATA 字段 已被棄用,無法藉此轉譯 Uri 真實路徑。

替代方法1 . 將照片 Uri 複製一個新的 File,儲存在允許的路徑底下,再將此 File 上傳至 Server

先建立一個 空 File 。請注意這個 File 是空且尚未被存到外部資料夾。

將 Uri 轉成 inputeStream

建立一 輸出資料流 ,會利用它將 Uri 資料寫入上面建立的空 File

透過從inputeStream 中讀取一定數量的字節(Byte),並將其存儲在緩衝區 ByteArry 中。返回值為 緩衝區 ByteArry中的字節個數,如果已經到達Stream末尾⽽沒有讀取到可用的字節(Byte),則返回-1,如果 ByteArry 的設定長度為零,則沒有讀取任何字節(Byte),返回值為 0。

因此當inputeStream.read(buf)返回值 非 0 或 -1 ,可以將資料寫入 File 中 。

最後記得 將 inputeStream 與 outputStream 關閉

上面步驟完成之後,我們成功的將檔案 複製到我們指定的路徑下,最後再把這個 File 傳遞給 Server。

替代方法2 .直接將 Uri 轉成 ByteArray 直接上傳到 Server

其實這個方法與上述方法差不多,差別在於不用另外再建立一個檔案,我們可以直接將讀到的 資料 輸出成 ByteArray,再將其直接上傳到 Server。

建立一 ByteArray 輸出流

接下來這個步驟與上個方法差不多,只有差在 改成調用 ByteArrayOutputStream, 將資料被寫入一個 byte 陣列。

最後使用 toByteArray() ,獲取我們要上傳 ByteArray

替代方法1 完整程式碼

替代方法2 完整程式碼

--

--