最近在研究怎么将安卓应用中的图片保存到手机相册。并且解决有一些手机保存图片到相册会出现发黄的问题。
如果要保存图片先在manifest中开启读写权限。
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在安卓6之后还要在java代码中动态开启
//开启权限
ActivityCompat.requestPermissions(MainActivity.this, new String[]{android
.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
首先获取到图片的bitmap对象,我使用的是Glide来加载图片所以就可以从Glide中获取到bitmap。
String url = "图片地址";
Glide.with(this)
.load(url)
.asBitmap()
.dontTransform()
.placeholder(R.drawable.back)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.listener(new RequestListener<String, Bitmap>() {
@Override
public boolean onException(Exception e, String model, Target<Bitmap> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Bitmap bitmap, String model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
picWidth = bitmap.getWidth();
picHeight = bitmap.getHeight();
mbitmap = bitmap;
return false;
}
})
.into(imageView);
然后保存图片的核心就是在这里。你可以直接保存到一个文件夹里面,也可以不为你的应用创建文件夹,但是这样图片看起来就会很凌乱。
当然还可以利用系统提供的api插入到系统相册,最后通知相册更新。
public static void saveImageToGallery(Context context, Bitmap bmp) {
// 创建文件夹
File appDir = new File(Environment.getExternalStorageDirectory(), "Test");
//判断不存在就创建
if (!appDir.exists()) {
appDir.mkdir();
}
//以时间命名
String fileName = System.currentTimeMillis() + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 其次把文件插入到系统图库
try {
MediaStore.Images.Media.insertImage(context.getContentResolver(),
file.getAbsolutePath(), fileName, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 最后通知图库更新
String path = Environment.getExternalStorageDirectory().getPath();
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path)));
}
}
在某一些手机上会出现保存的图片发黄的问题,比如小米和乐视,华为没有发现这个问题。
只要将保存的格式改为png,就正常了。
//以时间命名
String fileName = System.currentTimeMillis() + ".png";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
————————————————
版权声明:本文为CSDN博主「哥布林飞桶」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38379772/article/details/78565684