2016-06-10 3 views
4

Я хочу получить Exif данные для изображения, которое я выбираю из галереи Android или подобных приложений, таких как Google Фото. Вот методы, которые я использую для получения файла изображения из Uri:Получить данные Exif используя Uri

public static String getActualPathFromUri(@NonNull Context context, @NonNull Uri selectedImageUri) { 
     Bitmap bitmap = null; 
     try { 
      bitmap = getBitmapFromUri(context, selectedImageUri); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     if (bitmap == null) { 
      return null; 
     } 

     File imageFileFolder = new File(context.getCacheDir(), "example"); 
     if (!imageFileFolder.exists()) { 
      imageFileFolder.mkdir(); 
     } 

     FileOutputStream out = null; 

     File imageFileName = new File(imageFileFolder, "example-" + System.currentTimeMillis() + ".jpg"); 
     try { 
      out = new FileOutputStream(imageFileName); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 
      out.flush(); 
      out.close(); 
     } catch (IOException e) { 

     } finally { 
      if (out != null) { 
       try { 
        out.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     return imageFileName.getAbsolutePath(); 
    } 

    private static Bitmap getBitmapFromUri(@NonNull Context context, @NonNull Uri uri) throws IOException { 

     ParcelFileDescriptor parcelFileDescriptor = 
       context.getContentResolver().openFileDescriptor(uri, "r"); 
     assert parcelFileDescriptor != null; 
     FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); 
     Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor); 
     parcelFileDescriptor.close(); 
} 

Причины я выбираю Bitmap из Uri вместо того, чтобы система имени файла происходит потому, что метод фрагментирован для различных версий Android. Кроме того, в таких приложениях, как Google Фото, некоторые фотографии отображаются непосредственно с сервера и не хранятся на устройстве, поэтому получение имени файла невозможно. Даже если я получу имя файла, я получаю Security Exception при попытке использовать его в своем приложении.

Проблема с этим подходом заключается в том, что когда я получаю Bitmap, я не получаю данные Exif. Но мне нужны данные Exif и прикреплять их к файлу, который я сохраняю в своей папке cache, чтобы при загрузке изображения на сервер он получал изображение вместе с Exif, чтобы он мог выполнить некоторую дополнительную обработку. Причина в том, что мне нужно сохранить его как файл или хотя бы получить файл, если он уже существует в системе, потому что Retrofit нуждается в объекте File, который затем преобразуется в TypedFile и отправляется на сервер с использованием запроса Multipart.

Итак, как я могу точно получить Exif информацию из любого изображения Uri (локальное или на сервере), а затем сохранить изображение вместе с его данными Exif, чтобы я мог отправить его на сервер.

ответ

1

После кода может помочь вам

String path = FileUtility.getRealPathFromURI(context, Uri.parse(bitmapUri.getPath()); 
ExifInterface exif = new ExifInterface(path); 
rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL); 

FileUtility.java

public static String getRealPathFromURI(Context context, Uri contentUri) { 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
    return getPathForV19AndUp(context, contentUri); 
} else { 
    return getPathForPreV19(context, contentUri); 
} 
} 


public static String getPathForPreV19(Context context, Uri contentUri) { 
String res = null; 

String[] proj = { MediaStore.Images.Media.DATA }; 
Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null); 
if(cursor.moveToFirst()){; 
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    res = cursor.getString(column_index); 
} 
cursor.close(); 

return res; 
} 

@TargetApi(Build.VERSION_CODES.KITKAT) 
public static String getPathForV19AndUp(Context context, Uri contentUri) { 
String wholeID = DocumentsContract.getDocumentId(contentUri); 

// Split at colon, use second item in the array 
String id = wholeID.split(":")[1]; 
String[] column = { MediaStore.Images.Media.DATA }; 

// where id is equal to 
String sel = MediaStore.Images.Media._ID + "=?"; 
Cursor cursor = context.getContentResolver(). 
     query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
       column, sel, new String[]{ id }, null); 

String filePath = ""; 
int columnIndex = cursor.getColumnIndex(column[0]); 
if (cursor.moveToFirst()) { 
    filePath = cursor.getString(columnIndex); 
} 

cursor.close(); 
return filePath; 
} 
+1

Что такое 'FileUtility'? –

+0

Работает очень хорошо. Благодаря!! – javatar

 Смежные вопросы

  • Нет связанных вопросов^_^