本文实例讲述了Android开发实现保存图片到手机相册功能。分享给大家供大家参考,具体如下:
有一种很常见的需求,当保存图片的时候,客户需要在相册里面看到那张图片。有时候确实是保存成功了(通过IO流将图片写入了SDCard),但打开相册却看不到那张图片,需要在文件管理软件上才能找到那张图片,在网上找了许多文章,貌似都保存不到相册那里,这应该就是手机品牌的原因,有的品牌的手机能显示在相册里,有的品牌的手机却不能。解决这种问题,最简单粗暴的方法是,用那台手机拍一张照片,然后找到它,查看它的路径详情,直接根据路径用IO流写入,Android SDK 的 Build.BRAND 变量为当前手机的品牌,根据不同的品牌来做兼容处理,如果有读者用了这篇文章的代码还是不能在相册显示,可以对着这个思路来做兼容。另外值得一提的是,图片格式需要为JPEG格式才能显示在相册中,我们拍的照片也是JPEG格式的。下面用代码来实现上述的想法。
鉴于目前手机的版本普遍为Android 6.0 以上,读写外部存储文件都需要动态申请权限。这部分代码可以在当前需要读写外部存储文件的Activity中写。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
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.format( new Date())+ ".JPEG" ); } /* * 保存文件,文件名为当前日期 */ 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那样类里面,你就可以方便地运用到你的项目中了,这里我就不封装了。
希望本文所述对大家Android程序设计有所帮助。
原文链接:https://blog.csdn.net/QingSheng33/article/details/78738281