2 * Copyright (C) 2010 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.android.gallery3d.data;
19 import android.media.ExifInterface;
21 import com.android.gallery3d.R;
22 import com.android.gallery3d.common.ExifTags;
24 import java.io.IOException;
25 import java.util.HashMap;
26 import java.util.Iterator;
27 import java.util.Map.Entry;
28 import java.util.TreeMap;
30 public class MediaDetails implements Iterable<Entry<Integer, Object>> {
31 @SuppressWarnings("unused")
32 private static final String TAG = "MediaDetails";
34 private TreeMap<Integer, Object> mDetails = new TreeMap<Integer, Object>();
35 private HashMap<Integer, Integer> mUnits = new HashMap<Integer, Integer>();
37 public static final int INDEX_TITLE = 1;
38 public static final int INDEX_DESCRIPTION = 2;
39 public static final int INDEX_DATETIME = 3;
40 public static final int INDEX_LOCATION = 4;
41 public static final int INDEX_WIDTH = 5;
42 public static final int INDEX_HEIGHT = 6;
43 public static final int INDEX_ORIENTATION = 7;
44 public static final int INDEX_DURATION = 8;
45 public static final int INDEX_MIMETYPE = 9;
46 public static final int INDEX_SIZE = 10;
49 public static final int INDEX_MAKE = 100;
50 public static final int INDEX_MODEL = 101;
51 public static final int INDEX_FLASH = 102;
52 public static final int INDEX_FOCAL_LENGTH = 103;
53 public static final int INDEX_WHITE_BALANCE = 104;
54 public static final int INDEX_APERTURE = 105;
55 public static final int INDEX_SHUTTER_SPEED = 106;
56 public static final int INDEX_EXPOSURE_TIME = 107;
57 public static final int INDEX_ISO = 108;
59 // Put this last because it may be long.
60 public static final int INDEX_PATH = 200;
62 public static class FlashState {
63 private static int FLASH_FIRED_MASK = 1;
64 private static int FLASH_RETURN_MASK = 2 | 4;
65 private static int FLASH_MODE_MASK = 8 | 16;
66 private static int FLASH_FUNCTION_MASK = 32;
67 private static int FLASH_RED_EYE_MASK = 64;
70 public FlashState(int state) {
74 public boolean isFlashFired() {
75 return (mState & FLASH_FIRED_MASK) != 0;
79 public void addDetail(int index, Object value) {
80 mDetails.put(index, value);
83 public Object getDetail(int index) {
84 return mDetails.get(index);
88 return mDetails.size();
91 public Iterator<Entry<Integer, Object>> iterator() {
92 return mDetails.entrySet().iterator();
95 public void setUnit(int index, int unit) {
96 mUnits.put(index, unit);
99 public boolean hasUnit(int index) {
100 return mUnits.containsKey(index);
103 public int getUnit(int index) {
104 return mUnits.get(index);
107 private static void setExifData(MediaDetails details, ExifInterface exif, String tag,
109 String value = exif.getAttribute(tag);
111 if (key == MediaDetails.INDEX_FLASH) {
112 MediaDetails.FlashState state = new MediaDetails.FlashState(
113 Integer.valueOf(value.toString()));
114 details.addDetail(key, state);
116 details.addDetail(key, value);
121 public static void extractExifInfo(MediaDetails details, String filePath) {
123 ExifInterface exif = new ExifInterface(filePath);
124 setExifData(details, exif, ExifInterface.TAG_FLASH, MediaDetails.INDEX_FLASH);
125 setExifData(details, exif, ExifInterface.TAG_IMAGE_WIDTH, MediaDetails.INDEX_WIDTH);
126 setExifData(details, exif, ExifInterface.TAG_IMAGE_LENGTH,
127 MediaDetails.INDEX_HEIGHT);
128 setExifData(details, exif, ExifInterface.TAG_MAKE, MediaDetails.INDEX_MAKE);
129 setExifData(details, exif, ExifInterface.TAG_MODEL, MediaDetails.INDEX_MODEL);
130 setExifData(details, exif, ExifTags.TAG_APERTURE, MediaDetails.INDEX_APERTURE);
131 setExifData(details, exif, ExifTags.TAG_ISO, MediaDetails.INDEX_ISO);
132 setExifData(details, exif, ExifInterface.TAG_WHITE_BALANCE,
133 MediaDetails.INDEX_WHITE_BALANCE);
134 setExifData(details, exif, ExifTags.TAG_EXPOSURE_TIME,
135 MediaDetails.INDEX_EXPOSURE_TIME);
137 double data = exif.getAttributeDouble(ExifInterface.TAG_FOCAL_LENGTH, 0);
139 details.addDetail(MediaDetails.INDEX_FOCAL_LENGTH, data);
140 details.setUnit(MediaDetails.INDEX_FOCAL_LENGTH, R.string.unit_mm);
142 } catch (IOException ex) {