2017-03-29 89 views
1

我在我的应用程序中有一个功能,用户可以将图像复制到应用程序。该应用程序会将添加的文件重命名为数字,向上计数,但没有任何文件扩展名。保存的文件没有扩展名。如何重新获得其原始MIME类型?

所以基本上,如果用户增加beach.jpg它保存文件的副本向路径/文件名:“/画廊/ 1”

我保存到其中包含了SQLite数据库中的条目原始文件名称(在其他一些信息中)。

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

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

如何重新获得文件的正确MIME类型?我无法弄清楚如何实现这一目标。

现在的问题是,我可以选择发送图像的应用程序非常有限,因为“八位字节流”MIME类型。 WhatsApp等不能从列表中选择。

我当前的代码(片段)是这样的:

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; 
} 

感谢提前任何帮助。

回答

1

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

这里是一个答案,另一个相似的问题与如何做到这一点的方法:Checking File Signature

+0

感谢您的链接。获取MIME类型不是我的主要问题。问题是我需要以某种方式注入URL对象,以便android的共享功能将该对象识别为图像类型(jpg,png等)。我的代码中有问题的部分是:shareIntent.setType(activity.getContentResolver()。getType(uri)); “uri”对象在那里有错误的MIME类型(空)。 –

相关问题