`
yo8237233
  • 浏览: 60762 次
  • 来自: 深圳
社区版块
存档分类
最新评论

文件件监听器,android系统拍照功能调用后删除系统生成的照片

阅读更多
先说说要实现的功能:
android调用系统拍照功能实时 预览 删除 上传 保存 (用户不能再本地文件夹中看到拍的照片)
再说说遇到的问题:
1、调用系统拍照在系统自带的拍照文件夹中生成一张随机命名图片,此图片不好删除
2、在onActivityResult方法中的data下面拿到的照片是缩略图
3、你不能指定自己所照的目录为系统自带目录,这样系统会在其他地方生成一个新的目录

PS:经测试我手里拿到两台平板,一台有这种有问题1的情况,另外一台不会。

花费一天时间终于找到解决方案
起初的思路
1、获取到系统拍照的文件名实时删除系统生成的照片
2、获取到onActivityResult返回的data , 从data中找到系统所拍照片的bitmap,出现了新的问题,data为空,原因是拍照时指定了新的目录
更换了新的目录,data可以有值,但是Uri uri =  data.getData();时,uri死活取不到值,估计是不同厂商对拍照路径的处理不同,经过一番探索最终在getExtras();
取到了所拍照片的bitmap,从而获取到了照片的uri,此时一切看起来看么顺利。可是平台对我开了一个玩笑,居然生成了两个文件,不管如何处理,系统自带的目录下总是会生成一个随机命名的文件。获取不到文件名,谈何删除文件

新的思路:
想了许久发现了一个新的思路,既然获取不到文件名,那我就对文件夹进行处理。

解决方案:对文件夹进行监听,可是android工程并没有像web工程那样的监听器,所以利用了线程监听了系统文件夹目录,当产生新的文件时就删除新增加的文件,至此所要达到的效果就实现了

下面给出了文件监听器的原理和代码

原理:利用线程每隔一段时间遍历文件夹是否和之前的文件夹一致,如果一致则没变化,如果不一致则对变化的文件进行删除

代码:
import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class ListenFiles implements Runnable {

	private File dir;

	List<String> list = new ArrayList<String>();
	
	public ListenFiles(File fileDir){
		this.dir = fileDir;
		
		File[] files = dir.listFiles();
		
		for (int i = 0; i < files.length; i++) {
			list.add(files[i].getName());
		}
	}

	public boolean listenFiles(File file) {

		for (int i = 0; i < list.size(); i++) {
			if (file.getName().equals(list.get(i))) {
				return true;
			}
		}
		return false;// 存在新文件返回假
	}

	@Override
	public void run() {
		File[] Nowfiles = dir.listFiles();
		for (int j = 0; j < Nowfiles.length; j++) {
			boolean flag = listenFiles(Nowfiles[j]);
			if (flag == false) {
					Nowfiles[j].delete();
			}
		}
		try {
			Thread.sleep(3000);
			run();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		ListenFiles lf = new ListenFiles(new File("E:/老项目"));
		new Thread(lf).start();
		System.out.println("监视文件中......");

	}

}


这样就完成了对文件夹的监听

同时给出本人走不通的思路的代码吧,能用这种方式删除系统自己生产照片的可以交流下

这是拍照完成之后的回调方法:
@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);

		if (requestCode == REQUEST_CODE_CAPTURE_CAMEIA) {
			Bitmap bitmap = null;
			if(data!=null){
				Uri uri =  data.getData();
				if(uri != null){
					bitmap = BitmapFactory.decodeFile(uri.getPath()); 
				}else{
					if(bitmap == null){
						Bundle bundle = data.getExtras(); 
						bitmap = (Bitmap) bundle.get("data");
						uri  = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, null,null));
						SinoLifeLog.logDbInfo("uri.getPath()=========" + uri.getPath());
					}
				}
				File file = new File("");
				file.lastModified();
				Cursor cursor = this.getContentResolver().query(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, null,null, null, null);
				int totalCount = cursor.getCount();
				cursor.moveToFirst();
				for(int i=0; i<totalCount; i++){ 
				int index = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA);
				             String src = cursor.getString(index);
				             SinoLifeLog.logDbInfo("src=========" + src);
				         }
//				if (cursor.moveToFirst()) {
//					String filePath = cursor.getString(cursor.getColumnIndex("_data"));// 获取绝对路径
//					String filename = cursor.getString(cursor.getColumnIndex("_display_name"));// 获取绝对路径
//					String fileTime = cursor.getString(cursor.getColumnIndex("date_added"));// 获取绝对路径
//					SinoLifeLog.logDbInfo("filePath=========" + filePath);
//				}
				cursor.close();
				
			}
//	        if(data.getData() != null){
//	        	uri = data.getData(); 
//	        }else{
//	        } 
//	        SinoLifeLog.logDbInfo(String.valueOf(uri));
//				bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
			
			
			
			// 文件不存在
//			File file = new File(pathTmpFile);
//			if (file.exists() == false) {
//				ToastUtil.toast(context, "取消拍照");
//				return;
//			}

//			Bitmap bitmap = BitmapUtil.getimage(pathTmpFile);

//			String filePathName = MainApplication.potoSavePath + File.separator + photoName;
			String filePathName = MainApplication.potoSavePath + File.separator;

			SinoLifeLog.logDbInfo(filePathName);

			try {
				
				//把pathTmpFile中的图片压缩放入filePathName
				photoBitMap = BitmapUtil.compressAndSaveImage(bitmap, filePathName);
				if (photoBitMap != null) {

					showPhotoDialog(filePathName);

					// file.delete();
					// bitmap.recycle();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}


博客地址:http://qiaoyihang.iteye.com/
分享到:
评论

相关推荐

    java android 文件监听器

    对一个文件夹进行实时监控,当文件夹有新的文件出现时,对其做相应的操作

    android 外部类作为事件监听器类

    android 外部类作为事件监听器类 ,外部类形式的事件监听器不能自由访问创建GUI界面

    Android软键盘打开/关闭监听器

    在开发时遇到一个问题,需要对软...但是由于android不直接提供对软键盘打开与关闭操作的监听器,所以必须自己来写一个关于软键盘打开/关闭的监听器。 原理是通过对OnGlobalLayoutListener()来实现对软键盘的状态监听器

    Android实现静态广播监听器的方法

    主要介绍了Android实现静态广播监听器的方法,涉及Android的广播机制与记录监听广播信息的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    各种Android Dialog创建及其监听事件实现

    6 创建自定义列表对话框 笔者为该对话框添加了自定义的布局文件 该自定义布局文件包含一个文本标签和一个文本框 并实现了确定按钮点击监听事件 在文本框输入内容后 获取文本框里的内容 并以toast形式显示出来 ...

    ubuntu 利用proc 文件系统实现监听器

    在ubuntu系统中利用proc文件系统实现的监听器 ubuntu版本是17.10 qt版本是5.8 具体用法在我的博客里

    Android 生成最简单的dialog弹框.rar

    Android 生成最简单的dialog弹框,为Button设置OnClickListener监听器,然后调用onCreateDialog函数,声明一个Dialog对象,在这个函数中设置对话框的标题、图标、和提示内容以及为按钮添加监听器,生成生成Dialog...

    android 监听SD卡文件变化的实现代码

    Android系统API提供了FileObserver抽象类(Linux的INotify机制)来监听系统/sdcard中的文件或文件夹,FileObserver类能对sdcard中的文件及文件夹的打开、创建、移动和删除操作进行监控。下面看看代码实现: (1)...

    ProductivityToolkit-Unity事件监听器系统插件

    ProductivityToolkit-Unity事件监听器系统插件 Unity事件监听器系统 直观且快速地设置自定义事件,用于减少对象依赖的常见方法!几乎没有额外的代码来结构化游戏逻辑,可以通过拖放在检查器中处理事件订阅,可以在...

    android Button监听事件的几种类型

    android Button常用监听事件的几种类型

    Android OnClickListener按钮单击事件监听器用法范例.rar

    按钮单击事件一例,Android环境下,单击按钮后,改变 按钮背景颜色,通过这个功能来练习单击事件的监听器用法:  super.onCreate(savedInstanceState);  setContentView(R.layout.main);//设置当前屏幕  Button ...

    android全局事件监听器

    简单好用的全局监听器,没有用任何的第三方库,代码简单明了

    android 后台监听按键事件方法及demo

    android 后台监听按键事件方法及demoandroid 后台监听按键事件方法及demo

    疯狂Android讲义源码

     3.2.5 Activity本身作为事件监听器 153  3.2.6 匿名内部类作为事件监听器类 154  3.2.7 直接绑定到标签 155  3.3 基于回调的事件处理 156  3.3.1 回调机制与监听机制 156  3.3.2 基于回调的事件传播 158  ...

    Android监听器.pdf

    自己学习的总结

    android view变化监听器ViewTreeObserver的简单使用

    android view变化监听器ViewTreeObserver的简单使用 五种监听博客介绍:http://blog.csdn.net/qq_33078541/article/details/50680496

    Android图片自动滑动功能示例代码.rar

    Android界面图片自动滑动功能示例代码,安卓UI开发的一个小例子,仿优酷视频... 设置一个监听器,当ViewPager中的页面改变时调用,当Activity显示出来后,每两秒钟切换一次图片显示,当Activity不可见的时候停止切换。

    Android 简单音乐播放器 (涉及 CursorAdapter、ContentResolver、监听器、服务、广播)

    内容概要: ...能学到什么:ContentProvider、ContentResolver、CursorAdapter、Cursor、后台服务、前台服务、绑定服务、自定义广播、播放进度条、OnClickListener监听器 适用人群:Android开发初学者

    远程过程调用RPC生成工具

    3. 服务器端的监听器接收到这条消息后,将其转发给服务器上的调度程序。 4. 调度程序解包消息,获取参数,并调用实际的服务程序。 5. 服务程序执行请求的操作,并将结果返回给调度程序。 6. 调度程序将结果打包成...

Global site tag (gtag.js) - Google Analytics