最近在研究怎么将安卓应用中的图片保存到手机相册。并且解决有一些手机保存图片到相册会出现发黄的问题。
如果要保存图片先在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);