2017-03-29 17 views
1

사용자가 앱에 이미지를 복사 할 수있는 기능이 있습니다. 앱은 추가 된 파일의 이름을 위쪽으로 세지 만 파일 확장자없이 숫자로 바꿉니다.확장자가없는 저장된 파일입니다. 원본 MIME 형식을 다시 얻는 방법?

그래서 기본적으로 경로/파일 이름에 파일의 복사본을 저장 beach.jpg 사용자가 추가하는 경우 : "/ 갤러리/1"

내가 들어있는 SQLite는 데이터베이스에 항목을 저장하고있어 원래 파일 이름 (다른 정보 중에서).

사용자가 그리드 갤러리에서 이미지를 선택한 다음 공유 할 수 있도록 공유 기능을 만들었습니다. 내가 지금 가지고있는 문제는 MIME 형식을 공유하기 위해 "gallery/1"파일을 읽을 때 null입니다 (파일 이름 확장명이 없기 때문입니다).

내 아이디어는 파일을 읽고 원래 파일 이름으로 사본을 내 응용 프로그램 내의 일부 임시 폴더에 저장 한 다음 복사 한 파일을 공유하는 것이 었습니다. 파일의 MIME 유형이 "image/jpeg"가 아니라 "application/octet-stream"이라는 문제가 있습니다.

파일의 올바른 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). –