2017-03-29 3 views
1

私は、ユーザーがアプリケーションに画像をコピーすることができる私のアプリで機能を持っています。アプリは追加されたファイルの名前を数字に上書きしますが、ファイル拡張子は付けません。拡張子のない保存ファイル。元のMIMEタイプを元に戻す方法

だから、基本的には、パス/ファイル名ににファイルのコピーを保存しますbeach.jpgユーザーが追加した場合:「/ギャラリー/ 1」

私が含まれているSQLiteのデータベースにエントリを保存しています元のファイル名(他の情報の中に)

グリッドギャラリーから画像を選択して共有できるように、共有機能を作成しました。私が今問題になっているのは、MIMEタイプを共有するための "gallery/1"ファイルを読んでいるときです(ファイル名の拡張子がないため)。

私の考えは、ファイルを読み込んで元のファイル名でコピーを自分のアプリ内の一時フォルダに保存してから、そのコピーしたファイルを共有することでした。 ファイルの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タイプを取得する必要はありません。問題は、アンドロイドの共有機能がそのオブジェクトを画像タイプ(jpg、pngなど)として認識できるように、URLオブジェクトに何らかの形で挿入する必要があることです。私のコードの問題の部分は:shareIntent.setType(activity.getContentResolver()。getType(uri)); "uri"オブジェクトに間違ったMIMEタイプ(null)があります。 –

関連する問題