您的位置:首页 > 移动开发 > Android开发

记一次Android手机相册丢失事件及找回方案

2014-10-25 15:36 411 查看
今天打开相机拍照片,拍完发现DCIM目录下存了N久的照片全部没了~~泪奔。

Android目录存放删除文件的目录是LOST.DIR

进入之后会一大批以数字命名的不带后缀的文件,看文件大小发现最近的那几个文件大小和相片很相似,猜测可能是照片文件了~

果断把LOST.DIR里面所有的文件复制出来.用批处理全部重命名,加上后缀.jpg,熟悉的图片出来了~,其它手机上的文件丢失后可以用类似方式找回。

但是今天想记录的不仅仅是这些,删除后放到LOST.DIR目录里面的文件名全部被改掉了。上网百度了一下,相机照片有个exif信息,可以通过这个方法从LOST.DIR目录里过滤出相机照片。

思路是:遍历LOST.DIR里面所有的文件,检查文件的EXIF信息,如果没有即非照片,如果有再检测拍摄日期的字段,如果有该字段即相机拍摄的照片(可以用类似方式自由组合过滤),然后把该文件拷贝出来即可。

代码(需要用到metadata-extractor-2.6.4.jar包,链接:http://www.oschina.net/question/1_4456 Java与图像的EXIF信息

):

package org.jkstudio.demo.imgexif;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;

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;

/***
*  @Program Name  : DailyAccumulation.org.jkstudio.demo.imgexif.ExifTester.java
*  @Written by    : Jelon
*  @Creation Date : 2014年10月25日 下午3:20:18
*  @version       : v1.00
*  @Description   : 用于读取相片Exif信息Demo类
*  @ModificationHistory
*  Who          When                What
*  --------     ----------          ------------------------------------------------
*  Jelon    2014年10月25日下午3:20:18      TODO
***/
public class ExifTester {
/**
*  @Enclosing_Method  : checkImage
*  @Written by        : Jelon
*  @Creation Date     : 2014年10月25日 下午3:21:19
*  @version           : v1.00
*  @Description       : 检测图片的Exif信息
*
*  @param imagePath 图片文件路径
**/
private static void checkImage(String imagePath) {
File file = new File(imagePath);
Metadata metadata;
try {
metadata = ImageMetadataReader.readMetadata(file);
for (Directory directory : metadata.getDirectories()) {
for (Tag tag : directory.getTags()) {
//以图片信息包含拍摄时间判断是否为照片
if (tag.getTagName() == "Date/Time Original") {
System.out
.println("time:" + "---" + tag + "---" + file);// 获取图片的所有信息
String year = tag.getDescription().substring(0, 4);
String month = tag.getDescription().substring(5, 7);
String day = tag.getDescription().substring(8, 10);
String hour =tag.getDescription().substring(11, 13);
String minute = tag.getDescription().substring(14, 16);
String second = tag.getDescription().substring(17, 19);
//long ranNum3 =  Math.round(Math.random() * (999 - 1) + 100);
long ranNum3 = 111;
String destPhoName = "C360_"+year+"-"+month+"-"+day+"-"+hour+"-"+minute+"-"+second+"-"+ranNum3+".jpg";
String destDir = "H:/RestorePhoDir";
RestorePho2Dir(imagePath, destDir,destPhoName); //调用恢复图片函数
}
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (ImageProcessingException e) {
System.err.println("\n[FilePath] " + imagePath
+ "\n[The Error Message] " + e.getMessage());
} catch(NoClassDefFoundError e){
System.err.println(
"\n[UNKNOW The Error Message] " + e.getMessage());
}
}

/**
*  @Enclosing_Method  : RestorePho2Dir
*  @Written by        : Jelon
*  @Creation Date     : 2014年10月25日 下午2:47:05
*  @version           : v1.00
*  @Description       : 恢复照片到指定目录
*
*  @param imagePath 源图片路径
*  @param destDir 要恢复到的目标文件夹
* @param destPhoName 恢复后的目标文件名
**/
private static void RestorePho2Dir(String imagePath, String destDir, String destPhoName) {
try {
int byteSum = 0;
int byteRead = 0;
InputStream inStream = null;
FileOutputStream fs = null;

File myImage = new File(imagePath);
File myDestDir = new File(destDir);
if (!myDestDir.exists() && !myDestDir.isDirectory()) { //如果要恢复的目标文件夹不存在,创建之
myDestDir.mkdir();
}

if (myImage.exists()) { //复制图片到要恢复到的文件夹
inStream = new FileInputStream(myImage);
fs = new FileOutputStream(new File(destDir + "/"
+ destPhoName));
byte[] buffer = new byte[1024];
while ((byteRead = inStream.read(buffer)) != -1) {
byteSum += byteRead;
//System.out.println(byteSum);
fs.write(buffer, 0, byteRead);
}
inStream.close();
}
} catch (Exception e) {
System.err.println("\n[FilePath] " + imagePath
+ "\n[The Error Message] " + e.getMessage());
}
}

public static void main(String[] args)  {
File myPath = new File("H:/jpg3"); //LOST.DIR拷贝出来的文件放在这个里面
for (File file : myPath.listFiles()) {
checkImage(file.getPath());

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: