相信现在很多的应用都离不开照相机的使用,关于照相机我只是把自己做过的项目中遇到的问题整理一下,如果调用系统的相机我就不说了比较简单,
主要是说说自定义相机中遇到的问题,其实建议大家去看看源码,这样你可以更好的理解Camera,关于大概流程可以去网上搜去很多,在这
主要说说几个比较重要的点吧
第一点:预览图像的显示窗口 也就是SurfaceView了
If you want to set a specific size for your camera preview, set this in the surfaceChanged()
method as noted in the comments above. When setting preview size, you must use values from getSupportedPreviewSizes()
. Do notset arbitrary values in the setPreviewSize()
method
这一段比较关键,就是设置预览框的大小,大家都知道,android是半开源的,鉴于某些厂商把原有程序改的不成样子还有就是android的手机各种大小所以 如果你需要设定预览框的大小不要自己随便定义,很可能引起你的程序的崩溃,有的人可能这么想那么我就去设定为屏幕的宽高,几乎所有的手机都会支持,但是你可以发现,如果这样设定,你的预览的图像,并不是你想要的,可能被拉伸,最好设定一下预览的参数,可以用getSupportedPreviewSizes()方法去获取你的手机支持的设置值他返回的是一个list<Camera.Size>集合从中取,你想要的值这样就可以避免图片的拉伸和崩溃问题
Environment.getExternalStoragePublicDirectory
(Environment.DIRECTORY_PICTURES
)
此方法返回的是一个共享资源的位置,google建议在此下面构建一个子文件夹用于保存自己的图像,当你的程序被用户卸载该文件还会保留
Context.getExternalFilesDir
(Environment.DIRECTORY_PICTURES
)
此方法和上边的一样,返回一个标准位置不同的是如果将图片保存在该位置上,当用户卸载你的程序的时候,在该文件上的所有文件也将被卸载。
getExternalStoragePublicDirectory() 这个方法是在sdk2.2以及以上使用的 低版本的话用 Environment.getExternalStorageDirectory()去代替不过现在应该不用去过多考虑了 相信2.2一下的版本已经很少了。
还有就是图片和预览窗口图片旋转的问题了,预览图像的旋转可以使用setDisplayOrientation();而所照图片的旋转可以使用 setRotation 基本可以搞定的,还有一种需求就是要求不管是竖拍还是横拍,拍出来的图片都要是正的,你的相机类已经设定为保持竖屏,那么再用getResouration.getConfiguration.orientation,获取的会永远是竖屏,既然系统相机可以定位横竖屏那么,肯定也不只是用这种简单的方法了,寻寻觅觅终于找到神器,OrientationEventListener看到这个大家应该都明吧,有监听横竖平的接口而且不会受到你强制设置竖屏的影响