前言
有时候,手机上的照片越来越多,一时想不起来从哪里照的。其实,android 照片(原图)中是可以获取到时间,地点这些信息的。本文介绍一些方法,同时也提醒大家注意信息保护。
具体步骤
1.主要android类ExifInterface
主要图片属性如下 :
public static final String TAG_APERTURE = "FNumber";
public static final String TAG_APERTURE_VALUE = "ApertureValue";
public static final String TAG_ARTIST = "Artist";
public static final String TAG_BITS_PER_SAMPLE = "BitsPerSample";
public static final String TAG_BRIGHTNESS_VALUE = "BrightnessValue";
public static final String TAG_CFA_PATTERN = "CFAPattern";
public static final String TAG_COLOR_SPACE = "ColorSpace";
public static final String TAG_COMPONENTS_CONFIGURATION = "ComponentsConfiguration";
public static final String TAG_COMPRESSED_BITS_PER_PIXEL = "CompressedBitsPerPixel";
public static final String TAG_COMPRESSION = "Compression";
public static final String TAG_CONTRAST = "Contrast";
public static final String TAG_COPYRIGHT = "Copyright";
public static final String TAG_CUSTOM_RENDERED = "CustomRendered";
public static final String TAG_DATETIME = "DateTime";
public static final String TAG_DATETIME_DIGITIZED = "DateTimeDigitized";
public static final String TAG_DATETIME_ORIGINAL = "DateTimeOriginal";
public static final String TAG_DEFAULT_CROP_SIZE = "DefaultCropSize";
public static final String TAG_DEVICE_SETTING_DESCRIPTION = "DeviceSettingDescription";
public static final String TAG_DIGITAL_ZOOM_RATIO = "DigitalZoomRatio";
public static final String TAG_DNG_VERSION = "DNGVersion";
public static final String TAG_EXIF_VERSION = "ExifVersion";
public static final String TAG_EXPOSURE_BIAS_VALUE = "ExposureBiasValue";
public static final String TAG_EXPOSURE_INDEX = "ExposureIndex";
public static final String TAG_EXPOSURE_MODE = "ExposureMode";
public static final String TAG_EXPOSURE_PROGRAM = "ExposureProgram";
public static final String TAG_EXPOSURE_TIME = "ExposureTime";
public static final String TAG_FILE_SOURCE = "FileSource";
public static final String TAG_FLASH = "Flash";
public static final String TAG_FLASHPIX_VERSION = "FlashpixVersion";
public static final String TAG_FLASH_ENERGY = "FlashEnergy";
public static final String TAG_FOCAL_LENGTH = "FocalLength";
public static final String TAG_FOCAL_LENGTH_IN_35MM_FILM = "FocalLengthIn35mmFilm";
public static final String TAG_FOCAL_PLANE_RESOLUTION_UNIT = "FocalPlaneResolutionUnit";
public static final String TAG_FOCAL_PLANE_X_RESOLUTION = "FocalPlaneXResolution";
public static final String TAG_FOCAL_PLANE_Y_RESOLUTION = "FocalPlaneYResolution";
public static final String TAG_F_NUMBER = "FNumber";
public static final String TAG_GAIN_CONTROL = "GainControl";
public static final String TAG_GPS_ALTITUDE = "GPSAltitude";
public static final String TAG_GPS_ALTITUDE_REF = "GPSAltitudeRef";
public static final String TAG_GPS_AREA_INFORMATION = "GPSAreaInformation";
public static final String TAG_GPS_DATESTAMP = "GPSDateStamp";
public static final String TAG_GPS_DEST_BEARING = "GPSDestBearing";
public static final String TAG_GPS_DEST_BEARING_REF = "GPSDestBearingRef";
public static final String TAG_GPS_DEST_DISTANCE = "GPSDestDistance";
public static final String TAG_GPS_DEST_DISTANCE_REF = "GPSDestDistanceRef";
public static final String TAG_GPS_DEST_LATITUDE = "GPSDestLatitude";
public static final String TAG_GPS_DEST_LATITUDE_REF = "GPSDestLatitudeRef";
public static final String TAG_GPS_DEST_LONGITUDE = "GPSDestLongitude";
public static final String TAG_GPS_DEST_LONGITUDE_REF = "GPSDestLongitudeRef";
public static final String TAG_GPS_DIFFERENTIAL = "GPSDifferential";
public static final String TAG_GPS_DOP = "GPSDOP";
public static final String TAG_GPS_IMG_DIRECTION = "GPSImgDirection";
public static final String TAG_GPS_IMG_DIRECTION_REF = "GPSImgDirectionRef";
public static final String TAG_GPS_LATITUDE = "GPSLatitude";
public static final String TAG_GPS_LATITUDE_REF = "GPSLatitudeRef";
public static final String TAG_GPS_LONGITUDE = "GPSLongitude";
public static final String TAG_GPS_LONGITUDE_REF = "GPSLongitudeRef";
public static final String TAG_GPS_MAP_DATUM = "GPSMapDatum";
public static final String TAG_GPS_MEASURE_MODE = "GPSMeasureMode";
public static final String TAG_GPS_PROCESSING_METHOD = "GPSProcessingMethod";
public static final String TAG_GPS_SATELLITES = "GPSSatellites";
public static final String TAG_GPS_SPEED = "GPSSpeed";
public static final String TAG_GPS_SPEED_REF = "GPSSpeedRef";
public static final String TAG_GPS_STATUS = "GPSStatus";
public static final String TAG_GPS_TIMESTAMP = "GPSTimeStamp";
public static final String TAG_GPS_TRACK = "GPSTrack";
public static final String TAG_GPS_TRACK_REF = "GPSTrackRef";
public static final String TAG_GPS_VERSION_ID = "GPSVersionID";
public static final String TAG_IMAGE_DESCRIPTION = "ImageDescription";
public static final String TAG_IMAGE_LENGTH = "ImageLength";
public static final String TAG_IMAGE_UNIQUE_ID = "ImageUniqueID";
public static final String TAG_IMAGE_WIDTH = "ImageWidth";
public static final String TAG_INTEROPERABILITY_INDEX = "InteroperabilityIndex";
2.读取图片属性
代码如下:
try {
ExifInterface exifInterface = new ExifInterface(imagePath);
String datetime = exifInterface.getAttribute(ExifInterface.TAG_DATETIME);
String deviceName = exifInterface.getAttribute(ExifInterface.TAG_MAKE);
String deviceModel = exifInterface.getAttribute(ExifInterface.TAG_MODEL);
String latValue = exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
String lngValue = exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
String latRef = exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF);
String lngRef = exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF);
if (latValue != null && latRef != null && lngValue != null && lngRef != null) {
lat = convertRationalLatLonToFloat(latValue, latRef);
lng = convertRationalLatLonToFloat(lngValue, lngRef);
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
private static float convertRationalLatLonToFloat(String rationalString, String ref) {
String[] parts = rationalString.split(",");
String[] pair;
pair = parts[0].split("/");
double degrees = Double.parseDouble(pair[0].trim())/ Double.parseDouble(pair[1].trim());
pair = parts[1].split("/");
double minutes = Double.parseDouble(pair[0].trim())/ Double.parseDouble(pair[1].trim());
pair = parts[2].split("/");
double seconds = Double.parseDouble(pair[0].trim())/ Double.parseDouble(pair[1].trim());
double result = degrees + (minutes / 60.0) + (seconds / 3600.0);
if ((ref.equals("S") || ref.equals("W"))) {
return (float) -result;
}
return (float) result;
}
这样就获取到了经纬度信息,然后通过经纬度获取具体地址信息。
3.经纬度解析,主要android类Geocoder
代码如下,两种方式都可以得到具体地址:
private void getAddress(double latitude, double longitude) {
Geocoder gc = new Geocoder(MainActivity.this, Locale.getDefault());
try {
List<Address> locationList = gc.getFromLocation(latitude, longitude, 1);
if (locationList != null && locationList.size()>0) {
Address address = locationList.get(0);
String countryName = address.getCountryName();
String countryCode = address.getCountryCode();
String adminArea = address.getAdminArea();
String locality = address.getLocality();
String subAdminArea = address.getSubLocality();
String featureName = address.getFeatureName();
for (int i = 0; address.getAddressLine(i) != null; i++) {
String addressLine = address.getAddressLine(i);
System.out.println("addressLine=====" + addressLine);
}
}else{
Toast.makeText(MainActivity.this,"无法获取地址",Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
马上国庆节放假了,提前祝大家国庆节快乐!
|