一、選取圖片
在進行圖片保存操作之前,我們需要先從手機的相冊中選取一張圖片。這可以通過調用系統相冊,或者使用第三方圖片庫來實現。
使用系統相冊
使用系統相冊需要我們通過隱式意圖(Intent)打開相冊。下面是打開相冊並返回結果的代碼示例:
// 打開相冊 Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); startActivityForResult(intent, REQUEST_CODE_SELECT_IMAGE); // 獲取選中的圖片Uri @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_SELECT_IMAGE && resultCode == RESULT_OK) { Uri selectedImageUri = data.getData(); // 處理選中的圖片 } }
使用第三方圖片庫
如果需要更豐富的圖片展示和處理功能,我們可以使用第三方圖片庫。例如,使用Glide加載圖片:
Glide.with(this) .load(imageUrl) .into(imageView);
二、保存圖片
將圖片保存到相冊需要以下幾個步驟:
1、獲取圖片的Bitmap對象。
2、創建保存圖片的文件路徑。
3、保存圖片到指定路徑。
4、通知相冊刷新。
獲取圖片的Bitmap對象
如果圖片已經加載到了ImageView中,可以使用以下代碼獲取Bitmap對象:
imageView.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(imageView.getDrawingCache()); imageView.setDrawingCacheEnabled(false);
創建保存圖片的文件路徑
在Android Q之前,可以通過以下代碼創建保存圖片的文件路徑:
String imagePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath() + File.separator + "demo.jpg"; File file = new File(imagePath); if (!file.exists()) { boolean result = file.createNewFile(); }
Android Q 及以上版本的處理方式有所不同,需要使用MediaStore API來保存圖片。下面會有詳細的介紹。
保存圖片到指定路徑
使用以下代碼將Bitmap對象保存到指定文件路徑:
try { FileOutputStream fos = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); }
通知相冊刷新
在保存圖片成功後,需要向系統發送廣播通知相冊刷新。這樣才能在相冊中看到保存的圖片。
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(imagePath))));
三、在Android Q及以上版本中保存圖片到相冊
在Android Q及以上版本中,文件存儲得到了重新設計,並且禁止了直接操作外部存儲空間。因此,直接使用上面的代碼保存圖片到指定路徑的方式已經行不通了。
使用MediaStore API保存圖片
在Android Q及以上版本中,需要使用MediaStore API來保存圖片到相冊。具體流程如下:
1、創建一個ContentValues對象,並設置插入的數據信息。
2、使用ContentResolver將數據插入到MediaStore.Images.Media表中。
3、獲取新增圖片的Uri。
以下是保存圖片到相冊的完整代碼:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DISPLAY_NAME, "demo"); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM); ContentResolver resolver = getContentResolver(); Uri external = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Uri insertUri = resolver.insert(external, values); try { OutputStream stream = resolver.openOutputStream(insertUri); boolean compressed = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); stream.flush(); stream.close(); if (compressed) { Toast.makeText(this, "保存成功!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "保存失敗!", Toast.LENGTH_SHORT).show(); } } catch (IOException e) { e.printStackTrace(); } // 通知相冊刷新 if (insertUri != null) { MediaScannerConnection.scanFile(this, new String[]{insertUri.getPath()}, new String[]{"image/jpeg"}, null); } } else { // Android Q以下的保存方式 // ... }
四、總結
本文詳細闡述了Android保存圖片到相冊的步驟,從選取圖片到保存圖片的完整流程進行了詳細介紹,並給出了相關代碼示例。尤其是在Android Q及以上版本中,由於對文件存儲機制的變更,需要使用MediaStore API來保存圖片到相冊,這一點需要我們特別注意。
原創文章,作者:CRFA,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/137323.html