Android Q Kotlin - API 29: check if image exists

让人想犯罪 __ 提交于 2021-01-28 01:53:14

问题


This is the code I'm using to save image in Android Q:

private var fileName = ""
private fun downloadImage(){
    val folderName = "Funny"
    fileName = "bla_" + dlImageURL.split("/").toTypedArray().last()

    // find out here if this image already exists

    val requestOptions = RequestOptions()
        .skipMemoryCache(true)
        .diskCacheStrategy(DiskCacheStrategy.NONE)


    val bitmap = Glide.with(this@DownloadImage)
        .asBitmap()
        .load(dlImageURL)
        .apply(requestOptions)
        .submit()
        .get()



    try {

        val values = ContentValues()
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
        values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis() / 1000)
        values.put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/$folderName")
        values.put(MediaStore.Images.Media.IS_PENDING, true)
        values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis())
        values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName)
        values.put(MediaStore.Images.Media.TITLE, fileName)
        // RELATIVE_PATH and IS_PENDING are introduced in API 29.

        val uri: Uri? = this@DownloadImage.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)

        if (uri != null) {
            saveImageToStream(bitmap, this@DownloadImage.contentResolver.openOutputStream(uri))
            values.put(MediaStore.Images.Media.IS_PENDING, false)
            this@DownloadImage.contentResolver.update(uri, values, null, null)
        }

    } catch (e: Exception) {

    }
}



private fun saveImageToStream(bitmap: Bitmap, outputStream: OutputStream?) {
    if (outputStream != null) {
        try {
            bitmap.compress(Bitmap.CompressFormat.JPEG, 95, outputStream)
            outputStream.close()
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
} 

How can I find out if this image already exists in the gallery before I download it? I commented where it needs to be.

I already looked up and can't find out how to get the damn path, it was much easier < API 29


回答1:


I wrote sample code with ContentResolver.query() method. So I tried with Android Q. Sample is like this:

val projection = arrayOf(
                    MediaStore.Images.Media.DISPLAY_NAME,
                    MediaStore.MediaColumns.RELATIVE_PATH
    )

    val path = "Pictures/$folderName"
    val name = fileName

    val selection = MediaStore.Files.FileColumns.RELATIVE_PATH + " like ? and "+ MediaStore.Files.FileColumns.DISPLAY_NAME + " like ?"

    val selectionargs = arrayOf("%" + path + "%", "%" + name + "%")
    val cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, selection, selectionargs,  null);

    val indexDisplayName = cursor?.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME)

    if(cursor!!.count > 0){
        // file is exist
    }

    // or you can see displayName 
    while (cursor!!.moveToNext()) {
        val displayName = indexDisplayName?.let { cursor.getString(it) }
    }


来源:https://stackoverflow.com/questions/60958649/android-q-kotlin-api-29-check-if-image-exists

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!