package com.fancl.iloyalty.utils; import java.io.IOException; import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.media.ExifInterface; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore.Images; import android.provider.MediaStore.MediaColumns; public class ExifUtils { public static final String[] EXIF_TAGS = { "FNumber", ExifInterface.TAG_DATETIME, "ExposureTime", ExifInterface.TAG_FLASH, ExifInterface.TAG_FOCAL_LENGTH, "GPSAltitude", "GPSAltitudeRef", ExifInterface.TAG_GPS_DATESTAMP, ExifInterface.TAG_GPS_LATITUDE, ExifInterface.TAG_GPS_LATITUDE_REF, ExifInterface.TAG_GPS_LONGITUDE, ExifInterface.TAG_GPS_LONGITUDE_REF, ExifInterface.TAG_GPS_PROCESSING_METHOD, ExifInterface.TAG_GPS_TIMESTAMP, ExifInterface.TAG_IMAGE_LENGTH, ExifInterface.TAG_IMAGE_WIDTH, "ISOSpeedRatings", ExifInterface.TAG_MAKE, ExifInterface.TAG_MODEL, ExifInterface.TAG_WHITE_BALANCE, }; /** * Return the rotation of the passed image file * * @param filepath * image absolute file path * @return image orientation */ public static int getExifOrientation( final String filepath ) { if ( null == filepath ) return 0; ExifInterface exif = null; try { exif = new ExifInterface( filepath ); } catch ( IOException e ) { return 0; } return getExifOrientation( exif ); } public static int getExifOrientation( final ExifInterface exif ) { int degree = 0; if ( exif != null ) { final int orientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, -1 ); if ( orientation != -1 ) { switch ( orientation ) { case ExifInterface.ORIENTATION_ROTATE_90: degree = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: degree = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: degree = 270; break; } } } return degree; } /** * Load the exif tags into the passed Bundle * * @param filepath * @param out * @return true if exif tags are loaded correctly */ public static boolean loadAttributes( final String filepath, Bundle out ) { ExifInterface e; try { e = new ExifInterface( filepath ); } catch ( IOException e1 ) { e1.printStackTrace(); return false; } for ( String tag : EXIF_TAGS ) { out.putString( tag, e.getAttribute( tag ) ); } return true; } /** * Store the exif attributes in the passed image file using the TAGS stored in the passed bundle * * @param filepath * @param bundle * @return true if success */ public static boolean saveAttributes( final String filepath, Bundle bundle ) { ExifInterface exif; try { exif = new ExifInterface( filepath ); } catch ( IOException e ) { e.printStackTrace(); return false; } for ( String tag : EXIF_TAGS ) { if ( bundle.containsKey( tag ) ) { exif.setAttribute( tag, bundle.getString( tag ) ); } } try { exif.saveAttributes(); } catch ( IOException e ) { e.printStackTrace(); return false; } return true; } /** * Return the string representation of the given orientation * * @param orientation * @return */ public static String getExifOrientation( int orientation ) { switch ( orientation ) { case 0: return String.valueOf( ExifInterface.ORIENTATION_NORMAL ); case 90: return String.valueOf( ExifInterface.ORIENTATION_ROTATE_90 ); case 180: return String.valueOf( ExifInterface.ORIENTATION_ROTATE_180 ); case 270: return String.valueOf( ExifInterface.ORIENTATION_ROTATE_270 ); default: throw new AssertionError( "invalid: " + orientation ); } } /** * Try to get the exif orientation of the passed image uri * * @param context * @param uri * @return */ public static int getExifOrientation( Context context, Uri uri ) { final String scheme = uri.getScheme(); ContentProviderClient provider = null; if ( scheme == null || ContentResolver.SCHEME_FILE.equals( scheme ) ) { return getExifOrientation( uri.getPath() ); } else if ( scheme.equals( ContentResolver.SCHEME_CONTENT ) ) { try { provider = context.getContentResolver().acquireContentProviderClient( uri ); } catch ( SecurityException e ) { return 0; } if ( provider != null ) { Cursor result; try { result = provider.query( uri, new String[] { Images.ImageColumns.ORIENTATION, MediaColumns.DATA }, null, null, null ); } catch ( Exception e ) { e.printStackTrace(); return 0; } if ( result == null ) { return 0; } int orientationColumnIndex = result.getColumnIndex( Images.ImageColumns.ORIENTATION ); int dataColumnIndex = result.getColumnIndex( MediaColumns.DATA ); try { if ( result.getCount() > 0 ) { result.moveToFirst(); int rotation = 0; if ( orientationColumnIndex > -1 ) { rotation = result.getInt( orientationColumnIndex ); } if ( dataColumnIndex > -1 ) { String path = result.getString( dataColumnIndex ); rotation |= getExifOrientation( path ); } return rotation; } } finally { result.close(); } } } return 0; } }