Android 儲存圖片到手機相簿
阿新 • • 發佈:2019-01-24
有一種很常見的需求,當儲存圖片的時候,客戶需要在相簿裡面看到那張圖片。有時候確實是儲存成功了(通過IO流將圖片寫入了SDCard),但開啟相簿卻看不到那張圖片,需要在檔案管理軟體上才能找到那張圖片,在網上找了許多文章,貌似都儲存不到相簿那裡,這應該就是手機品牌的原因,有的品牌的手機能顯示在相簿裡,有的品牌的手機卻不能。解決這種問題,最簡單粗暴的方法是,用那臺手機拍一張照片,然後找到它,檢視它的路徑詳情,直接根據路徑用IO流寫入,Android SDK 的 Build.BRAND 變數為當前手機的品牌,根據不同的品牌來做相容處理,如果有讀者用了這篇文章的程式碼還是不能在相簿顯示,可以對著這個思路來做相容。另外值得一提的是,圖片格式需要為JPEG格式才能顯示在相簿中,我們拍的照片也是JPEG格式的。下面用程式碼來實現上述的想法。
鑑於目前手機的版本普遍為Android 6.0 以上,讀寫外部儲存檔案都需要動態申請許可權。這部分程式碼可以在當前需要讀寫外部儲存檔案的Activity中寫。
String[] PERMISSIONS = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE" };
//檢測是否有寫的許可權
int permission = ContextCompat.checkSelfPermission(this,
"android.permission.WRITE_EXTERNAL_STORAGE" );
if (permission != PackageManager.PERMISSION_GRANTED) {
// 沒有寫的許可權,去申請寫的許可權,會彈出對話方塊
ActivityCompat.requestPermissions(this, PERMISSIONS,1);
}
儲存檔案的方法:
public void SaveBitmapFromView(View view) {
int w = view.getWidth();
int h = view.getHeight();
Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bmp);
view.layout(0, 0, w, h);
view.draw(c);
// 縮小圖片
Matrix matrix = new Matrix();
matrix.postScale(0.5f,0.5f); //長和寬放大縮小的比例
bmp = Bitmap.createBitmap(bmp,0,0, bmp.getWidth(),bmp.getHeight(),matrix,true);
DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
saveBitmap(bmp,format.parse(new Date())+".JPEG");
return bmp;
}
/*
* 儲存檔案,檔名為當前日期
*/
Public void saveBitmap(Bitmap bitmap, String bitName){
String fileName ;
File file ;
if(Build.BRAND .equals("Xiaomi") ){ // 小米手機
fileName = Environment.getExternalStorageDirectory().getPath()+"/DCIM/Camera/"+bitName ;
}else{ // Meizu 、Oppo
fileName = Environment.getExternalStorageDirectory().getPath()+"/DCIM/"+bitName ;
}
file = new File(fileName);
if(file.exists()){
file.delete();
}
FileOutputStream out;
try{
out = new FileOutputStream(file);
// 格式為 JPEG,照相機拍出的圖片為JPEG格式的,PNG格式的不能顯示在相簿中
if(bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out))
{
out.flush();
out.close();
// 插入相簿
MediaStore.Images.Media.insertImage(this.getContentResolver(), file.getAbsolutePath(), bitName, null);
}
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
// 傳送廣播,通知重新整理相簿的顯示
this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + fileName)));
}
以上就是儲存圖片到相簿的方式,程式碼寫在Activity類中,而我們只要稍微封裝一下這些程式碼到你的ImageUtil 或者 FileUtil那樣類裡面,你就可以方便地運用到你的專案中了,這裡我就不封裝了。