20

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

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

4

8 回答 8

20

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

于 2014-01-29T20:37:09.050 回答
9

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

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

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

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

  3. 确保使用 android.permission.WRITE_EXTERNAL_STORAGE 正确配置您的权限

为了完整起见,在此处发布此内容,因为我从 insertImage 获得了 null,原因是1。

于 2013-08-24T19:13:46.573 回答
5

当我在具有新 sdcard 映像的模拟器上运行测试时遇到了这个问题。我能够通过创建来解决/sdcard/Pictures问题

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

于 2015-10-29T18:56:41.067 回答
5

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

<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();
        }
    }
于 2018-06-13T11:20:14.113 回答
2

我遇到了同样的问题,但没有任何效果。但最终在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
    }

我实现了在这个应用程序中共享新闻位图,它工作正常。享受!

于 2020-10-06T14:21:08.087 回答
1

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

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
于 2015-03-28T15:43:47.010 回答
1

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

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

于 2017-09-27T12:23:58.673 回答
0

尝试这个:

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

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

于 2020-12-12T05:28:43.073 回答