(react-native-image-picker)MIME type application/octet-stream cannot be inserted into content

react-native-image-picker@3.3.2 中 saveToPhotos为true时, 在Android14 报错
java.lang.IllegalArgumentException: MIME type application/octet-stream cannot be inserted into content://media/external/images/media; expected MIME type under image/*
这个错误通常发生在你尝试将文件(特别是非图片文件)保存到Android设备的媒体存储库(MediaStore)中的图片目录时。错误提示“MIME type application/octet-stream cannot be inserted into content://media/external/images/media; expected MIME type under image/*”明确指出,你尝试插入的MIME类型是application/octet-stream,这是一个通用的二进制流类型,而目标位置(即图片媒体库)期望的是image/*类型的MIME类型,比如image/jpegimage/png等。

要解决这个问题,你可以采取以下几个步骤:

  1. 确认文件类型
    确保你正在尝试保存的文件确实是一个图片文件。如果文件不是图片,你可能需要将其保存在不同的位置,如外部存储的某个自定义文件夹中,而不是媒体库的图片目录。

  2. 设置正确的MIME类型
    在将文件保存到媒体库之前,确保你为其设置了正确的MIME类型。如果你正在处理一个图片文件,你应该根据文件的实际格式(如JPEG、PNG等)来设置MIME类型。

  3. 修改代码
    在你的代码中,当你调用ContentResolverinsert()方法时,确保你为Uri(如MediaStore.Images.Media.EXTERNAL_CONTENT_URI)传递了正确的MIME类型。例如,如果你正在保存一个JPEG图片,你应该这样做:

    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.DISPLAY_NAME, "image_name.jpg");
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
    values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + File.separator + "MyApp");
    
    Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    
    if (uri != null) {
        // 使用uri来保存文件数据
        OutputStream outputStream = getContentResolver().openOutputStream(uri);
        // 写入文件数据到outputStream
        outputStream.close();
    }
    
  4. 检查文件内容
    如果文件确实是一个图片文件,但MIME类型被错误地设置为application/octet-stream,那么可能是文件本身的元数据或文件扩展名有误。确保文件扩展名与文件内容相匹配。

  5. 使用第三方库
    如果你在处理文件类型时遇到困难,可以考虑使用第三方库来帮助你确定文件的MIME类型,如Apache Commons IO的FilenameUtils.getExtension()MimeTypeUtils.guessMimeType()

通过上述步骤,你应该能够解决这个MIME类型不匹配的问题,并成功将图片文件保存到Android设备的媒体库中。如果问题仍然存在,可能需要进一步检查你的文件处理逻辑或查看Android的官方文档以获取更多信息。


image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容