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

今天打开相机拍照片,拍完发现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());
			
		}
	}
}


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值