我的应用程序中有一个功能,用户可以将图像复制到应用程序。该应用程序会将添加的文件重命名为数字,向上计数,但没有任何文件扩展名。
所以基本上如果用户添加了beach.jpg,它会将文件的副本保存到路径/文件名:" / gallery / 1"
我将一个条目保存到包含原始文件名的sqlite数据库(在其他一些信息中)。
我已经制作了共享功能,因此用户可以从网格库中选择图像然后共享它。我现在遇到的问题是,当我正在阅读" gallery / 1"用于共享MIME类型的文件为空(因为没有文件扩展名)。
所以我的想法是读取文件并将原始文件名的副本保存到我的应用程序内的某个临时文件夹中,然后共享该复制的文件。 问题在于文件的MIME类型是" application / octet-stream"而不是" image / jpeg"。
如何重新获取文件的正确MIME类型?我无法弄清楚如何实现这一目标。
现在的问题是我可以选择发送图像的应用程序非常有限,因为" octet-stream" 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;
}
提前感谢您的帮助。
答案 0 :(得分:1)
您需要检查文件头字节,并将文件头中的Magic Bytes
与图像的已知值进行比较,以确定它是什么类型。
以下是另一个类似问题的答案,其中包含如何执行此操作的方法:Checking File Signature