Why Images.Media.insertImage return null

前端 未结 7 491
耶瑟儿~
耶瑟儿~ 2020-12-03 20:55

I have some code where I run the method MediaStore.Images.Media.insertImage (inserting it from a source not a file name), This code saves the image to the MediaStore and ret

相关标签:
7条回答
  • 2020-12-03 21:28

    I was executing MediaStore.Images.Media.insertImage before getting user permission to WRITE_EXTERNAL_STORAGE and READ_EXTERNAL_STORAGE which was causing a null path

    So make sure user has allowed for permission and then store image

    0 讨论(0)
  • 2020-12-03 21:36

    MediaStore.Images.Media.insertImage is actually accessing external storage to save the image.

    Some important reminders which might be causing your app to fail:

    1. A USB connection will block SD card usage if in Mass Storage mode.

    2. There may be other factors that might lead to an SD card being inaccessible, so make sure that you can access the SD card using a file browser first.

    3. Make sure that your permissions are correctly configured with android.permission.WRITE_EXTERNAL_STORAGE

    Posting this here for completeness, as I was getting a null from insertImage, and the cause was 1.

    0 讨论(0)
  • 2020-12-03 21:39

    It seems to happen when you don't have an /sdcard/DCIM/Camera directory on some versions of Android. Creating this directory (and having the permission) solved the problem for me.

    0 讨论(0)
  • 2020-12-03 21:40

    I ran into this issue when I was running tests on an emulator with a fresh sdcard image. I was able to solve the problem by creating /sdcard/Pictures with

    new File("/sdcard/Pictures").mkdirs();

    0 讨论(0)
  • 2020-12-03 21:42

    I faced the same issue and nothing worked. But finally after 3 hours it worked.

    Solution: I found that It works fine until we delete that image from our image gallery. After that It starts returning null. But suddenly I tried changing title and description name and it worked like a charm.

    So I've added a date with the title and description of bitmap. In case, user deletes bitmap manually from file manager. Still It works.

      private fun insertImage(cr: ContentResolver,
            source: Bitmap?,
            title: String,
            description: String
        ): String? {
    
            val sdf = SimpleDateFormat("MM-dd-yyyy-hh.mm.ss.SSS.a", Locale.US)
            val date=sdf.format(Date())
    
            val values = ContentValues()
            values.put(Images.Media.TITLE, title)
            values.put(Images.Media.DISPLAY_NAME, title+date)
            values.put(Images.Media.DESCRIPTION, description+date)
            values.put(Images.Media.MIME_TYPE, "image/jpeg")
            // Add the date meta data to ensure the image is added at the front of the gallery
            values.put(Images.Media.DATE_ADDED, System.currentTimeMillis() / 1000)
            values.put(Images.Media.DATE_TAKEN, System.currentTimeMillis())
    
            var url: Uri? = null
            var stringUrl: String? = null    /* value to be returned */
    
            try {
                url = cr.insert(Images.Media.EXTERNAL_CONTENT_URI, values)
    
                if (source != null) {
                    val imageOut = cr.openOutputStream(url!!)
                    try {
                        source.compress(Bitmap.CompressFormat.JPEG, 50, imageOut)
                    } finally {
                        imageOut!!.close()
                    }
    
    
                } else {
                    cr.delete(url!!, null, null)
                    url = null
                }
            } catch (e: Exception) {
                if (url != null) {
                    cr.delete(url, null, null)
                    url = null
                }
            }
    
            if (url != null) {
                stringUrl = url.toString()
            }
    
            return stringUrl
        }
    

    I Implemented to share news bitmap in this app and it's working fine. Enjoy!

    0 讨论(0)
  • 2020-12-03 21:44

    Make sure you have added permissions in your manifest file.

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    

    Then add this code before calling

    MediaStore.Images.Media.insertImage

    File sdcard = Environment.getExternalStorageDirectory();
        if (sdcard != null) {
            File mediaDir = new File(sdcard, "DCIM/Camera");
            if (!mediaDir.exists()) {
                mediaDir.mkdirs();
            }
        }
    
    0 讨论(0)
提交回复
热议问题