需求:邪恶相机
要求拍照时没有预览界面,每隔一定时间自动snap一张。
这种应用应该做成service或者widget很合适,现在只是用Activity做的。
按照某教程上给的例子写的,大致流程如下:
在AndroidManifest.xml中定义所需权限——写sdcard权限,camera权限;
在xml中放SurfaceView供预览使用;
代码中获得SurfaceView的SurfaceHolder,给holder注册回调;
在回调的surfaceCreated方法中Camera.open,setParameters,setPreviewDisplay(holder);
startPreview;
takePicture,takePicture之后会自动stopPreview,如果要继续拍照需要再次startPreview。
第一次尝试把预览部分的SurfaceView等步骤去掉,因为觉得Preview和takePicture应该是2个独立的动作。去掉后发现不行,加上后可以拍照了。
但是有其它问题,只能拍照一张,第二次调用takePicture挂掉。看代码百思不得其解,最后仔细看SDK,说得很详细:一定不要在takePicture的回调返回之前再次startPreview!而我几次尝试都是把startPreview放在takePicture调用之后或者回调函数的最后的。我把它放到takePicture之前,可以连续拍照了。
还是有问题,连续拍照几张后继续死。看log,死在takePicture里了,还好有源码,发现对应的是一个申请内存语句。我又冥思苦想了一番,内存泄露?不能,代码肯定没问题,GC也应该没问题,那应该是碎片导致?因为每张照片需要申请约2MB的内存,很有可能是碎片导致,回头一想又不太可能,因为之前每次都是申请差不多大小的内存,GC回收后这块内存应该是可以重复用的啊。想得头疼,暂时一放。
昨天就进行到这了,今天继续。
几个疑问:
1.preview和takePicture必须绑定吗?不合理;
2.takePicture之后再次startPreview的时机问题,应该takePicture回调完成给个通知才好吧。