package com.avenwu.deepinandroid; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.media.ExifInterface; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.os.AsyncTaskCompat; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.drew.imaging.ImageMetadataReader; import com.drew.imaging.ImageProcessingException; import com.drew.metadata.Directory; import com.drew.metadata.Metadata; import com.drew.metadata.Tag; import net.avenwu.support.widget.FlatTabGroup; import java.io.IOException; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * Created by chaobin on 3/4/15. */ public class ExifViewerFragment extends Fragment { ImageView mImageView; TextView mTextView; @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.exif_layout, null); mImageView = (ImageView) view.findViewById(R.id.image); mTextView = (TextView) view.findViewById(R.id.text); FlatTabGroup tabs = (FlatTabGroup) view.findViewById(R.id.tabs); tabs.setSelection(0); tabs.setOnTabCheckedListener(new FlatTabGroup.OnTabCheckedListener() { @Override public void onChecked(FlatTabGroup group, int position) { switch (position) { case 0: decodeWith(new AssetsImageExifDecoder()); break; case 1: decodeWith(new ExternalImageExifDecoder()); break; } } }); return view; } private void decodeWith(ExifDecoder decoder) { AsyncTaskCompat.executeParallel(new AsyncTask<ExifDecoder, Void, ExifBean>() { @Override protected ExifBean doInBackground(ExifDecoder... params) { return new ExifBean(params[0].decodeBitmap(), params[0].extractExif()); } @Override protected void onPostExecute(ExifBean exifBean) { if (exifBean.bitmap != null) { mImageView.setImageBitmap(exifBean.bitmap); } if (exifBean.value != null) { mTextView.setText(exifBean.value); } } }, decoder); } interface ExifDecoder { Bitmap decodeBitmap(); String extractExif(); } /** * ExifInterface seems not support image in assets */ class AssetsImageExifDecoder implements ExifDecoder { final String ASSETS_IMAGE_PATH = "image2.jpg"; @Override public Bitmap decodeBitmap() { try { return BitmapFactory.decodeStream(getResources().getAssets().open(ASSETS_IMAGE_PATH)); } catch (IOException e) { Log.d("ExifViewerFragment", "AssetsImageExifDecoder decodeBitmap failed"); e.printStackTrace(); } return null; } @Override public String extractExif() { try { Metadata metadata = ImageMetadataReader.readMetadata(getResources().getAssets().open(ASSETS_IMAGE_PATH)); Iterator<Directory> iterator = metadata.getDirectories().iterator(); final String output = "%s=%s"; StringBuilder builder = new StringBuilder(); while (iterator.hasNext()) { Directory d = iterator.next(); for (Tag tag : d.getTags()) { builder.append(String.format(output, tag.getTagName(), tag.getDescription())) .append("\n"); } } return builder.toString(); } catch (ImageProcessingException e) { e.printStackTrace(); Log.d("ExifViewerFragment", "get attributes failed"); } catch (IOException e) { e.printStackTrace(); Log.d("ExifViewerFragment", "get attributes failed"); } return null; } } class ExternalImageExifDecoder implements ExifDecoder { //TODO replace with your own image path final String EXTRANAL_IMAGE_PATH = "/storage/sdcard1/DCIM/Camera/IMG_20150304_162932.jpg"; @Override public Bitmap decodeBitmap() { return BitmapFactory.decodeFile(EXTRANAL_IMAGE_PATH); } @Override public String extractExif() { try { ExifInterface exifInterface = new ExifInterface(EXTRANAL_IMAGE_PATH); StringBuilder builder = new StringBuilder(); final String output = "%s=%s"; try { Field field = exifInterface.getClass().getDeclaredField("mAttributes"); field.setAccessible(true); HashMap<String, String> attrs = (HashMap<String, String>) field.get(exifInterface); for (Map.Entry<String, String> entry : attrs.entrySet()) { builder.append(String.format(output, entry.getKey(), entry.getValue())).append("\n"); } } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return builder.toString(); } catch (IOException e) { Log.d("ExifViewerFragment", "get attributes failed"); e.printStackTrace(); } return null; } } class ExifBean { Bitmap bitmap; String value; public ExifBean(Bitmap bitmap, String value) { this.bitmap = bitmap; this.value = value; } } }