Android开发实现保存图片到手机相册功能
本文实例讲述了Android开发实现保存图片到手机相册功能。分享给大家供大家参考,具体如下:
有一种很常见的需求,当保存图片的时候,客户需要在相册里面看到那张图片。有时候确实是保存成功了(通过IO流将图片写入了SDCard),但打开相册却看不到那张图片,需要在文件管理软件上才能找到那张图片,在网上找了许多文章,貌似都保存不到相册那里,这应该就是手机品牌的原因,有的品牌的手机能显示在相册里,有的品牌的手机却不能。解决这种问题,最简单粗暴的方法是,用那台手机拍一张照片,然后找到它,查看它的路径详情,直接根据路径用IO流写入,AndroidSDK的Build.BRAND变量为当前手机的品牌,根据不同的品牌来做兼容处理,如果有读者用了这篇文章的代码还是不能在相册显示,可以对着这个思路来做兼容。另外值得一提的是,图片格式需要为JPEG格式才能显示在相册中,我们拍的照片也是JPEG格式的。下面用代码来实现上述的想法。
鉴于目前手机的版本普遍为Android6.0以上,读写外部存储文件都需要动态申请权限。这部分代码可以在当前需要读写外部存储文件的Activity中写。
String[]PERMISSIONS={
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE"};
//检测是否有写的权限
intpermission=ContextCompat.checkSelfPermission(this,
"android.permission.WRITE_EXTERNAL_STORAGE");
if(permission!=PackageManager.PERMISSION_GRANTED){
//没有写的权限,去申请写的权限,会弹出对话框
ActivityCompat.requestPermissions(this,PERMISSIONS,1);
}
保存文件的方法:
publicvoidSaveBitmapFromView(Viewview){
intw=view.getWidth();
inth=view.getHeight();
Bitmapbmp=Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
Canvasc=newCanvas(bmp);
view.layout(0,0,w,h);
view.draw(c);
//缩小图片
Matrixmatrix=newMatrix();
matrix.postScale(0.5f,0.5f);//长和宽放大缩小的比例
bmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),matrix,true);
DateFormatformat=newSimpleDateFormat("yyyyMMddHHmmss");
saveBitmap(bmp,format.format(newDate())+".JPEG");
}
/*
*保存文件,文件名为当前日期
*/
PublicvoidsaveBitmap(Bitmapbitmap,StringbitName){
StringfileName;
Filefile;
if(Build.BRAND.equals("Xiaomi")){//小米手机
fileName=Environment.getExternalStorageDirectory().getPath()+"/DCIM/Camera/"+bitName;
}else{//Meizu、Oppo
fileName=Environment.getExternalStorageDirectory().getPath()+"/DCIM/"+bitName;
}
file=newFile(fileName);
if(file.exists()){
file.delete();
}
FileOutputStreamout;
try{
out=newFileOutputStream(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(FileNotFoundExceptione)
{
e.printStackTrace();
}
catch(IOExceptione)
{
e.printStackTrace();
}
//发送广播,通知刷新图库的显示
this.sendBroadcast(newIntent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,Uri.parse("file://"+fileName)));
}
以上就是保存图片到相册的方式,代码写在Activity类中,而我们只要稍微封装一下这些代码到你的ImageUtil或者FileUtil那样类里面,你就可以方便地运用到你的项目中了,这里我就不封装了。
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android图形与图像处理技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。