Android 11 分區存儲圖片裁剪上傳異常問題


1、targetSdkVersion 29 以下 不包含29 使用 android:requestLegacyExternalStorage="true"
可以解決問題
android:requestLegacyExternalStorage="true" 操作文件需要設置為true

2、如果targetSdkVersion大於29的話 把裁剪后的路徑修改為公共路徑 但是僅在模擬上可運行,真機還是不行
getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
getExternalStoragePublicDirectory 這個方法早就標記刪除了

3、targetSdkVersion大於29 

先處理 調用系統裁剪的輸出目錄
val values = ContentValues()
values.put(MediaStore.Images.Media.DISPLAY_NAME, name)
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
values.put(MediaStore.Images.Media.DATE_MODIFIED, System.currentTimeMillis() / 1000)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM)
}
val uri = requireContext().contentResolver.insert(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    values
)

使用上面的uri 作為裁剪的輸出目錄
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri)

Android 10 及以下可以 直接 File(uri.path) 獲取到文件 這樣就可以進行上傳了
Android 11 及以上就需要特殊處理了
使用contentResolver 處理
下面的方法獲取后綴
MimeTypeMap.getSingleton().getExtensionFromMimeType(contentResolver.getType(uri))
// 獲取到輸入流inputStream
contentResolver.openInputStream(uri)
// 可以使用context.getExternalFilesDir 圖片的目錄 創建一個文件
context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)?.absolutePath
讀取輸入流 使用輸出流包裝文件 把輸入流寫入到輸出流中 當前文件就有內容了
直接把當前file 上傳即可
Android 11 直接使用 File(uri.path) 上傳 會提示 open failed: EACCES (Permission denied)


targetSdkVersion大於29的情況下)sdk 大於28 下面的權限就不要聲明了,聲明了也沒有什么用
android:name="android.permission.WRITE_EXTERNAL_STORAGE" 
動態申請存儲權限時,申請 android.permission.READ_EXTERNAL_STORAGE 這個權限即可
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM