2017-03-29 90 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類型(空)。 –

相關問題