现在可以放心地将代码移植到AndroidStudio程序中去了。在原有的onPictureTaken()方法的基础上,增加红色框中的内容,如图3.14所示。其含义为:通过getFile方法查找手机"/sdcard/test"目录下的所有文件,将结果返回至list中。然后通过调用checkFileName方法,检查list中是否有符合filename的文件名(filename已在之前定义),checkFileName方法会返回合理的文件名,再通过字符串连接,将完整的路径保存到path字符串中,作为完整的文件名路径。
为了更清晰的显示文件保存的路径和文件名信息,我在布局文件中增加了一个textview组件,在path生成之后,将path输出到textview显示,这样就会对文件的路径信息更加直观。
最后,将getFile和checkFileName方法都移植到java文件中,就可以运行测试了。
图3.14
同样重新生成APK文件测试运行,进行多次拍摄,下面是我拍摄第8次时的界面截图(图3.15)。
图3.15
因为文件名起始索引为0,所以第8次生成的文件名应该是camera7.jpg,可以从APP界面中看到文件的保存路径。现在在test文件夹下,会有8张我刚刚拍摄的图片,命名方式为camera+i。图3.16展示了test文件夹下的文件信息,文件的保存也是正常的。
图3.16
之前的多次测试中,我发现该程序的一个bug:在每次点击“拍照“按钮之后,预览画面就会卡住(静止且没有响应),而且如果此时再次点击”拍照“或”退出“按钮,程序就会意外退出。
经过查阅资料,我了解到,该问题是由以下原因造成的:
在执行拍照命令时,会调用camera.takePicture()方法,该方法在执行过程中会调用camera.stopPreview来获取拍摄帧数据,从而进行数据回调。而调用camera.stopPreview方法,就会暂停相机的预览,并表现为预览画面卡住。如果此时用户点击了按钮的话,也就会再次调用camera.takepicture方法,由于相机还没有开始预览,没有进行相关进程的初始化,就会出现之前遇到的意外退出问题。
解决的方法也很简单,既然camera.takePicture () 方法调用了camera.stopPreview来停止预览,那么只要在camera.takePicture()方法结束之后,手动调用一次camera.startPreview方法,来开启相机预览就可以了。
于是进行添加图3.17红框中的部分:
图3.17
再次生成APK文件进行测试,图3.18为测试结果。
图3.18
这是我拍摄第9张图片之后的界面。上方的imageview组件显示的是第9张的图片,而下面的surfaceView显示的是此时的预览画面。此时如果我连续拍摄,继续点击“拍照“按钮,程序也不会因为bug而意外退出了。实现了连续拍照的功能。