【问题标题】:Saved file without extension. How to re-gain its original MIME Type?保存的文件没有扩展名。如何重新获得原来的 MIME 类型?
【发布时间】:2017-08-23 12:15:54
【问题描述】:

我的应用中有一个功能,用户可以将图像复制到应用中。该应用程序会将添加的文件重命名为数字,向上计数,但没有任何文件扩展名。

所以基本上如果用户添加 beach.jpg,它会将文件的副本保存到路径/文件名:“/gallery/1”

我正在将一个条目保存到包含原始文件名(以及其他一些信息)的 sqlite 数据库中。

我做了一个分享功能,用户可以从网格图库中选择图片然后分享。我现在遇到的问题是,当我读取用于共享的“gallery/1”文件时,MIME 类型为空(因为没有文件扩展名)。

所以我的想法是读取文件并将原始文件名的副本保存到我的应用程序内的某个临时文件夹中,然后共享该复制的文件。 问题在于文件的 MIME 类型是“application/octet-stream”而不是“image/jpeg”。

如何重新获得文件的正确 MIME 类型?我不知道如何实现这一点。

现在的问题是,由于“octet-stream”MIME 类型,我可以选择将图像发送到的应用程序非常有限。无法从列表中选择 Whatsapp 等。

我当前的代码(sn-ps)如下所示:

private void shareFile() {
    ShareCompat.IntentBuilder shareIntent = ShareCompat.IntentBuilder.from(activity);

    List<Uri> uris = getSelectedImagesAllGalleries();
    Log.d(TAG, "shareFile() uris size: " + uris.size());

    for (Uri uri : uris) {
        Log.d(TAG, "shareFile() URI: " + uri.getPath());
        Log.d(TAG, "shareFile() URI TYPE: " + activity.getContentResolver().getType(uri)); // is now always "application/octet-stream"
        shareIntent.setType(activity.getContentResolver().getType(uri));
        shareIntent.addStream(uri);
    }

    startActivity(shareIntent.getIntent());
}

private List<Uri> getSelectedImagesAllGalleries() {
    List<Uri> selectedImages = new ArrayList<>();
    selectedImages.addAll(getSelectedImages());
    return selectedImages;
}


private List<Uri> getSelectedImages() {
    List<Uri> uriList = new ArrayList<>();
    for (Media media : mediaList) {

        Log.d(TAG, "getSelectedImages(): " + media.getOriginalFileName() + " / " + media.isSelected());

        // Here I create a copy of the file using its original file name incl. its file extension
        File fileToShare = mediaTools.createTemporaryFileForSharing(media, activity);

        if (fileToShare.exists() && media.isSelected()) {
            Uri contentUri = FileProvider.getUriForFile(activity, activity.getPackageName(), fileToShare);
            uriList.add(contentUri);
        }
    }
    return uriList;
}

提前感谢您的帮助。

【问题讨论】:

    标签: android mime-types android-sharing


    【解决方案1】:

    您需要检查文件头字节并将文件头中的Magic Bytes 与图像的已知值进行比较,以确定它是什么类型。

    这里是另一个类似问题的答案,其中包含如何执行此操作的方法:Checking File Signature

    【讨论】:

    • 感谢您的链接。获取 MIME 类型并不是我遇到的主要问题。问题是我需要以某种方式将它注入到 URL 对象中,以便 android 的共享功能将该对象识别为图像类型(jpg、png 等)。我的代码中有问题的部分是: shareIntent.setType(activity.getContentResolver().getType(uri)); “uri”对象在那里有错误的 mime 类型(null)。
    猜你喜欢
    • 2014-06-14
    • 2013-09-11
    • 1970-01-01
    • 2012-05-19
    • 2011-05-27
    • 2015-10-03
    • 1970-01-01
    • 2010-11-05
    相关资源
    最近更新 更多