【Android 文件管理】分区存储 ( 修改与删除图片文件 )
文章目錄
- 一、分區存儲模式下使用 MediaStore 修改圖片
- 二、分區存儲模式下使用 MediaStore 刪除圖片
- 三、相關文檔資料
Android 分區存儲系列博客 :
- 【Android 文件管理】應用可訪問的存儲空間 ( 存儲空間分類 | 存儲空間訪問權限 | 分區存儲 )
- 【Android 文件管理】分區存儲 ( 分區存儲機制 和 文件索引數據 )
- 【Android 文件管理】分區存儲 ( MediaStore 文件操作 )
- 【Android 文件管理】分區存儲 ( 創建與查詢圖片文件 )
- 【Android 文件管理】分區存儲 ( 修改與刪除圖片文件 )
在上一篇博客 【Android 文件管理】分區存儲 ( 創建與查詢圖片文件 ) 中 , 使用 MediaStore 在外置存儲 SD 卡中的 Pictures 目錄中 , 創建 了 image.jpg 圖片文件 , 并進行了 查詢 ;
本篇博客講解使用 MediaStore 修改 , 刪除 圖片文件操作 ;
一、分區存儲模式下使用 MediaStore 修改圖片
將 /sdcard/Pictures/image/ 目錄下的 image.jpg 修改為 image_update.jpg ;
分區存儲機制中 , 刪除圖片文件 , 不能通過獲取其絕對路徑進行刪除 , 必須先使用 MediaStore 查詢到圖片文件的 Uri , 然后通過 Uri 執行 刪除 / 修改 圖片文件的操作 ;
查詢圖片 : 查詢圖片文件的具體原理參考 【Android 文件管理】分區存儲 ( 創建與查詢圖片文件 ) , 不再詳細分析 ;
首先 , 調用 getContentResolver 方法獲取 ContentResolver , 執行 query 查詢方法 ; 傳入 查詢的 Uri , 指定要查詢的列 , 查詢語句, 查詢參數 , 排列規則 , 這 555 個參數 , 查詢結果是 Cursor 對象 ;
// 查詢 SQLite 數據庫 var cursor = contentResolver.query(// 指定要查詢的 UriMediaStore.Images.Media.EXTERNAL_CONTENT_URI,// 指定要查詢的列null,// 指定查詢語句"${MediaStore.Images.Media.DISPLAY_NAME}=?",// 指定查詢參數arrayOf("image.jpg"),// 排序規則null )然后 , 從 Cursor 中獲取 MediaStore.Images.Media._ID 字段對應的值 , 通過 ContentUris 的 withAppendedId 方法 , 將 _id 字段值轉為 Uri , 并保存在外部變量中 ;
// 要刪除的圖片對應的 Uri, 需要先查詢出來 var uri: Uri?= null// 先獲取該圖片在數據庫中的 id , 然后通過 id 獲取 Uri if (cursor != null && cursor.moveToFirst()){// 獲取第 0 行 _id 所在列的值var id = cursor.getLong(// 獲取 _id 所在列的索引cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID))// 通過 _id 字段獲取圖片 Uriuri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);Log.i(TAG, "查詢到的 Uri = $uri , 開始準備刪除")// 關閉游標cursor.close() }得到了圖片的 Uri 地址 , 就可以對圖片進行 刪除 / 修改 操作了 ; 在 分區存儲機制 中 , 只能通過文件的 Uri 地址操作文件的 增 刪 查 改 ;
修改圖片 : 構造 ContentValues , 將 display_name 修改成 image_update , 設置 MediaStore.Images.ImageColumns.DISPLAY_NAME 字段對應的值為 “image_update.jpg” , 然后 調用 getContentResolver 方法獲取 ContentResolver , 調用 update 方法 , 更新圖片 Uri 對應的數據 , 將上述 ContentValues 更新到 Uri 對應的數據庫表中 ;
// 修改圖片 // 構造 ContentValues var contentValues: ContentValues = ContentValues(); // 將 display_name 修改成 image_update contentValues.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, "image_update.jpg")// 修改文件名稱 var row = contentResolver.update(uri!!, contentValues, null, null) Log.i(TAG, "修改 uri = $uri 結果 row = $row")查詢 并 修改 圖片文件代碼示例 :
/*** 修改圖片*/ fun updateImages(){// 要刪除的圖片對應的 Uri, 需要先查詢出來var uri: Uri?= null// 查詢 SQLite 數據庫var cursor = contentResolver.query(// 指定要查詢的 UriMediaStore.Images.Media.EXTERNAL_CONTENT_URI,// 指定要查詢的列null,// 指定查詢語句"${MediaStore.Images.Media.DISPLAY_NAME}=?",// 指定查詢參數arrayOf("image.jpg"),// 排序規則null)// 先獲取該圖片在數據庫中的 id , 然后通過 id 獲取 Uriif (cursor != null && cursor.moveToFirst()){// 獲取第 0 行 _id 所在列的值var id = cursor.getLong(// 獲取 _id 所在列的索引cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID))// 通過 _id 字段獲取圖片 Uriuri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);Log.i(TAG, "查詢到的 Uri = $uri , 開始準備修改")// 關閉游標cursor.close()}// 修改圖片// 構造 ContentValuesvar contentValues: ContentValues = ContentValues();// 將 display_name 修改成 image_updatecontentValues.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, "image_update.jpg")// 修改文件名稱var row = contentResolver.update(uri!!, contentValues, null, null)Log.i(TAG, "修改 uri = $uri 結果 row = $row") } /**日志打印結果 :
查詢到的 Uri = content://media/external/images/media/53 , 開始準備修改 修改 uri = content://media/external/images/media/53 結果 row = 1文件刪除效果 : 在 /sdcard/Pictures/image/ 目錄中 , image.jpg 文件已經被修改為 image_update.jpg 文件 ;
二、分區存儲模式下使用 MediaStore 刪除圖片
將 /sdcard/Pictures/image/ 目錄下的 image_update.jpg 文件刪除 ;
分區存儲機制中 , 刪除圖片文件 , 不能通過獲取其絕對路徑進行刪除 , 必須先使用 MediaStore 查詢到圖片文件的 Uri , 然后通過 Uri 執行 刪除 / 修改 圖片文件的操作 ;
查詢圖片 : 查詢圖片文件的具體原理參考 【Android 文件管理】分區存儲 ( 創建與查詢圖片文件 ) , 不再詳細分析 ;
首先 , 調用 getContentResolver 方法獲取 ContentResolver , 執行 query 查詢方法 ; 傳入 查詢的 Uri , 指定要查詢的列 , 查詢語句, 查詢參數 , 排列規則 , 這 555 個參數 , 查詢結果是 Cursor 對象 ;
// 查詢 SQLite 數據庫 var cursor = contentResolver.query(// 指定要查詢的 UriMediaStore.Images.Media.EXTERNAL_CONTENT_URI,// 指定要查詢的列null,// 指定查詢語句"${MediaStore.Images.Media.DISPLAY_NAME}=?",// 指定查詢參數arrayOf("image_update.jpg"),// 排序規則null )然后 , 從 Cursor 中獲取 MediaStore.Images.Media._ID 字段對應的值 , 通過 ContentUris 的 withAppendedId 方法 , 將 _id 字段值轉為 Uri , 并保存在外部變量中 ;
// 要刪除的圖片對應的 Uri, 需要先查詢出來 var uri: Uri?= null// 先獲取該圖片在數據庫中的 id , 然后通過 id 獲取 Uri if (cursor != null && cursor.moveToFirst()){// 獲取第 0 行 _id 所在列的值var id = cursor.getLong(// 獲取 _id 所在列的索引cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID))// 通過 _id 字段獲取圖片 Uriuri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);Log.i(TAG, "查詢到的 Uri = $uri , 開始準備刪除")// 關閉游標cursor.close() }得到了圖片的 Uri 地址 , 就可以對圖片進行 刪除 / 修改 操作了 ; 在 分區存儲機制 中 , 只能通過文件的 Uri 地址操作文件的 增 刪 查 改 ;
刪除圖片 : 調用 getContentResolver 方法獲取 ContentResolver , 直接刪除之前查詢出的圖片 Uri 即可 ;
// 刪除圖片 var row = contentResolver.delete(uri!!, null, null)Log.i(TAG, "刪除 uri = $uri 結果 row = $row")查詢 并 刪除 圖片文件代碼示例 :
/*** 刪除圖片*/ fun deleteImages(){// 要刪除的圖片對應的 Uri, 需要先查詢出來var uri: Uri?= null// 查詢 SQLite 數據庫var cursor = contentResolver.query(// 指定要查詢的 UriMediaStore.Images.Media.EXTERNAL_CONTENT_URI,// 指定要查詢的列null,// 指定查詢語句"${MediaStore.Images.Media.DISPLAY_NAME}=?",// 指定查詢參數arrayOf("image_update.jpg"),// 排序規則null)// 先獲取該圖片在數據庫中的 id , 然后通過 id 獲取 Uriif (cursor != null && cursor.moveToFirst()){// 獲取第 0 行 _id 所在列的值var id = cursor.getLong(// 獲取 _id 所在列的索引cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID))// 通過 _id 字段獲取圖片 Uriuri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);Log.i(TAG, "查詢到的 Uri = $uri , 開始準備刪除")// 關閉游標cursor.close()}// 刪除圖片var row = contentResolver.delete(uri!!, null, null)Log.i(TAG, "刪除 uri = $uri 結果 row = $row") }日志打印結果 :
查詢到的 Uri = content://media/external/images/media/53 , 開始準備刪除 刪除 uri = content://media/external/images/media/53 結果 row = 1文件刪除效果 : 在 /sdcard/Pictures/image/ 目錄中 , image_update.jpg 文件已經被刪除 ;
三、相關文檔資料
Android 文件處理參考文檔 :
-
數據和文件存儲概覽 : https://developer.android.google.cn/training/data-storage
-
訪問應用專屬文件 : https://developer.android.google.cn/training/data-storage/app-specific#kotlin
-
保存到共享的存儲空間 : https://developer.android.google.cn/training/data-storage/shared
-
管理存儲設備上的所有文件 : https://developer.android.google.cn/training/data-storage/manage-all-files
-
分享文件 : https://developer.android.google.cn/training/secure-file-sharing
-
應用安裝位置 : https://developer.android.google.cn/guide/topics/data/install-location
-
Android 存儲用例和最佳做法 : https://developer.android.google.cn/training/data-storage/use-cases
-
FileProvider : https://developer.android.google.cn/reference/androidx/core/content/FileProvider
博客源碼 :
-
GitHub : https://github.com/han1202012/File
-
CSDN : https://download.csdn.net/download/han1202012/18935612
總結
以上是生活随笔為你收集整理的【Android 文件管理】分区存储 ( 修改与删除图片文件 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 文件管理】分区存储 (
- 下一篇: 【Android Gradle】安卓应用