为什么Images.Media.insertImage返回null

时间:2012-09-01 19:57:58

标签: android mediastore insert-image

我有一些代码,我运行方法MediaStore.Images.Media.insertImage(从源而不是文件名插入),此代码将图像保存到MediaStore并返回图像的uri。我知道当它因任何原因失败时它将返回null而不是uri。此图片已被许多人多次下载,并且每隔一段时间它将从此方法返回null。我从来没有遇到过这种情况,所以我不知道发生了什么。这可能发生的原因是什么?还有另一个post具有相同的问题,但答案是指向MediaStore的源代码的链接,但该链接转到指向该链接不可用的页面。任何帮助,将不胜感激。感谢。

取出我的SD卡后,我收到了这个错误,所以我知道这可能是一个原因,我不确定,但我觉得如果卡已满,也会发生这种情况。仍然只是想知道是否还有其他原因。

8 个答案:

答案 0 :(得分:16)

在某些Android版本上没有/ sdcard / DCIM / Camera目录时,似乎会发生这种情况。创建这个目录(并拥有权限)解决了我的问题。

答案 1 :(得分:8)

MediaStore.Images.Media.insertImage实际上是访问外部存储来保存图像。

可能导致您的应用失败的一些重要提示:

  1. 如果处于大容量存储模式,USB连接将阻止SD卡使用。

  2. 可能还有其他因素导致SD卡无法访问,因此请确保您可以先使用文件浏览器访问SD卡。

  3. 确保使用android.permission.WRITE_EXTERNAL_STORAGE

  4. 正确配置了您的权限

    在此处发布此内容是为了完整性,因为我从insertImage获取了一个null,原因是 1.

答案 2 :(得分:5)

当我在带有新SD卡图像的模拟器上运行测试时遇到了这个问题。通过使用

创建/sdcard/Pictures,我能够解决问题

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

答案 3 :(得分:2)

当我遇到这样的问题时,我通过添加权限来修复它:

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

答案 4 :(得分:1)

我在获得 WRITE_EXTERNAL_STORAGE READ_EXTERNAL_STORAGE 的用户权限之前执行MediaStore.Images.Media.insertImage,这导致了空路径

因此,请确保用户已获得许可,然后存储图像

答案 5 :(得分:1)

确保您在清单文件中添加了权限。

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

然后在调用

之前添加此代码
  

MediaStore.Images.Media.insertImage

File sdcard = Environment.getExternalStorageDirectory();
    if (sdcard != null) {
        File mediaDir = new File(sdcard, "DCIM/Camera");
        if (!mediaDir.exists()) {
            mediaDir.mkdirs();
        }
    }

答案 6 :(得分:1)

我遇到了同样的问题,但没有任何效果。但终于在3个小时后,它开始工作了。

解决方案::我发现在我们从图片库中删除该图片之前,它可以正常工作。之后,它开始返回 null。,但是突然间,我尝试更改标题和描述名称,并且它像一种魅力一样工作。

因此,我添加了一个日期以及位图的标题和描述。如果用户从文件管理器中手动删除位图。仍然有效。

  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
    }

我实现了在this app中共享新闻位图,并且工作正常。 享受吧!

答案 7 :(得分:0)

尝试一下:

MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmap, "filename", null);

Android 10在insertImage()方法的第三个参数上需要实际的文件名。