kotlin-保存图片到相册
结合之前的几篇文章的知识点去实现一个保存图片到相册的功能并进行展示:
想说下实现这个思路:
在图片的显示我用了Glide的框架,而图片下载就是用OkHttp进行网络请求,然后通过广播去通知相册进行刷新,emmmm大概思路就是这样!!
至于依赖之类的我就不在这里写了,毕竟前面几篇文章已经写了
首先准备一个封装好的具有下载以及保存到相册的工具类:
class PhotoUtils { fun saveBitmapGallery(context: Context, bitmap: Bitmap): Boolean { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { //返回出一个URI val insert = context.contentResolver.insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, /* 这里如果不写的话 默认是保存在 /sdCard/DCIM/Pictures */ ContentValues()//这里可以啥也不设置 保存图片默认就好了 ) ?: return false //为空的话 直接失败返回了 //这个打开了输出流 直接保存图片就好了 context.contentResolver.openOutputStream(insert).use { it ?: return false bitmap.compress(Bitmap.CompressFormat.JPEG, 100, it) } return true } else { MediaStore.Images.Media.insertImage(context.contentResolver, bitmap, "title", "desc") return true } } fun saveFile2Gallery(context: Context, url: String): Boolean { //返回出一个URI val insert = context.contentResolver.insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, /* 这里可以默认不写 默认保存在 */ ContentValues() ) ?: return false //为空的话 直接失败返回了 //这个打开了输出流 直接保存图片就好了 context.contentResolver.openOutputStream(insert).use { os -> os ?: return false var x = download(url, os) return x } return false } fun saveFile2Gallery2(context: Context, url: String): Boolean { val name = System.currentTimeMillis().toString() val photoPath = Environment.DIRECTORY_DCIM + "/Camera" val contentValues = ContentValues().apply { put(MediaStore.MediaColumns.DISPLAY_NAME, name) put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { put(MediaStore.MediaColumns.RELATIVE_PATH, photoPath)//保存路径 put(MediaStore.MediaColumns.IS_PENDING, true) } } //返回出一个URI val insert = context.contentResolver.insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues ) ?: return false //这个打开了输出流 直接保存图片就好了 context.contentResolver.openOutputStream(insert).use { os -> os ?: return false var x = download(url, os) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { contentValues.put(MediaStore.MediaColumns.IS_PENDING, false) } return x } return false } fun saveBitmap2Gallery2(context: Context, bitmap: Bitmap): Boolean { val name = System.currentTimeMillis().toString() val photoPath = Environment.DIRECTORY_DCIM + "/Camera" val contentValues = ContentValues().apply { put(MediaStore.MediaColumns.DISPLAY_NAME, name) put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { put(MediaStore.MediaColumns.RELATIVE_PATH, photoPath)//保存路径 put(MediaStore.MediaColumns.IS_PENDING, true) } } val insert = context.contentResolver.insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues ) ?: return false //为空的话 直接失败返回了 //这个打开了输出流 直接保存图片就好了 context.contentResolver.openOutputStream(insert).use { it ?: return false bitmap.compress(Bitmap.CompressFormat.JPEG, 100, it) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { contentValues.put(MediaStore.MediaColumns.IS_PENDING, false) } return true } private fun download(url: String, os: OutputStream): Boolean { val url = URL(url) (url.openConnection() as HttpURLConnection).also { conn -> conn.requestMethod = "GET" conn.connectTimeout = 5 * 1000 if (conn.responseCode == 200) { conn.inputStream.use { ins -> val buf = ByteArray(2048) var len: Int while (ins.read(buf).also { len = it } != -1) { os.write(buf, 0, len) } os.flush() } return true } else { return false } } }}
里面考虑到各种类型的下载方式已经到相册的方法,具体探讨的过程请详细查看大佬的文章:
https://juejin.im/post/6850418121724051470
然后直接上内容:
class MainActivity : AppCompatActivity() { lateinit var btnDown:Button //图片的控件 lateinit var ivPic:ImageView private val url="https://img.iplaysoft.com/wp-content/uploads/2019/free-images/free_stock_photo.jpg" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) ivPic=findViewById(R.id.gilde_pic) btnDown=findViewById(R.id.btn_down) onClick() } fun onClick(){ btnDown.setOnClickListener { Thread(){ kotlin.run { PhotoUtils().saveFile2Gallery2(applicationContext,url) } }.start() Glide.with(this@MainActivity) .load(url) .into(ivPic) } }}
是不是很简单,其实都是多亏了蜜蜂Bee大佬写的好东西,方便了好多!!!!
作者:jeffrey12138
链接:https://www.jianshu.com/p/2c2644887f64