设为首页 加入收藏

TOP

Android实现简单的相机程序
2015-02-02 14:10:56 来源: 作者: 【 】 浏览:22
Tags:Android 实现 简单 相机 程序

代码
class surface extends SurfaceView implements SurfaceHolder.Callback {


? ? ? ? SurfaceHolder sfholder;


? ? ? ? Camera camera;


? ? ? ? Bitmap bitmap;


? ? ? ? public surface(Context context) {
? ? ? ? ? ? super(context);
? ? ? ? ? ? // TODO Auto-generated constructor stub
?
? ? ? ? ? ? sfholder = getHolder();
? ? ? ? ? ? sfholder.addCallback(this);
? ? ? ? ? ? sfholder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
? ? ? ? }


? ? ? ? public void surfaceChanged(SurfaceHolder holder, int format, int width,
? ? ? ? ? ? ? ? int height) {
? ? ? ? ? ? // TODO Auto-generated method stub
? ? ? ? ? ? Camera.Parameters parameters = camera.getParameters();
? ? ? ? ? ? parameters.setPictureFormat(PixelFormat.JPEG);
? ? ? ? ? ? parameters.setPreviewSize(320, 480);
? ? ? ? ? ? parameters.setPictureSize(320, 480);
? ? ? ? ? ? camera.setParameters(parameters);
? ? ? ? ? ? camera.startPreview();
? ? ? ? }


? ? ? ? public void surfaceCreated(SurfaceHolder holder) {
? ? ? ? ? ? // TODO Auto-generated method stub
?
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? camera = Camera.open();
? ? ? ? ? ? ? ? camera.setPreviewDisplay(sfholder);
? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? camera.release();
? ? ? ? ? ? ? ? camera = null;
? ? ? ? ? ? }
? ? ? ? }


? ? ? ? public void surfaceDestroyed(SurfaceHolder holder) {
? ? ? ? ? ? // TODO Auto-generated method stub
? ? ? ? ? ? camera.stopPreview();
? ? ? ? ? ? camera = null;


? ? ? ? }
? ? ? ? //拍照
? ? ? ? public void takePicture()
? ? ? ? {
? ? ? ? ? ? if (camera != null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? camera.takePicture(null, null, jpegCallback);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ?
? ? ? ? //拍照并且保存的回调函数
? ? ? ?
? ? ? ? private PictureCallback jpegCallback = new PictureCallback() {
? ? ? ? ? ?
? ? ? ? ? ? public void onPictureTaken(byte[] data, Camera camera) {
? ? ? ? ? ? ? ? // TODO Auto-generated method stub
? ? ? ? ? ? ? ? try
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
? ? ? ? ? ? ? ? File file = new File("/sdcard/camera1.jpg");
? ? ? ? ? ? ? ? BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
? ? ? ? ? ? ? ? bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);
? ? ? ? ? ? ? ? bos.flush();
? ? ? ? ? ? ? ? bos.close();
? ? ? ? ? ? ? ? Canvas? canvas= sfholder.lockCanvas();
? ? ? ? ? ? ? ? canvas.drawBitmap(bitmap, 0,0, null);
? ? ? ? ? ? ? ? sfholder.unlockCanvasAndPost(canvas);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? catch(Exception e)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }


这个是一个拍照的类,使用的是SurfaceView来实现的,如果想要在一部分上显示,并且使用按钮操作的话,可以修改一下这个类,而且这个是拍照之后停留在拍照页面的,如果需要在拍照后不停留在拍照页面的,可以自行修改和添加参数。


此程序也演示了,如何在拍完照之后,将照片保存到SD卡上。


实际使用时的操作如何,使用的是按键进行拍照的,其实也可以改为使用按钮进行拍照的,只要对这个类进行简单的修改即可。调用如下:


代码


@Override
? ? public boolean onKeyDown(int keyCode, KeyEvent event) {
? ? ? ? // TODO Auto-generated method stub
? ? ? ? if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER)
? ? ? ? ? ? sf.takePicture();
? ? ? ? return super.onKeyDown(keyCode, event);
? ? }


要使用相机和操作SD卡,则需要添加以下权限:




第一条是可以使用扩展存储设备的权限


第二条是可以使用照相机设备


如果没有这两条权限的话,会报错,具体错误可以在DDMS中查看 。欢迎交流!


希望对大家有所帮助 !


此平台使用提Android2.2 V8的系统,如果使用1.5或者是其它的,权限可能会不一样!


当然更好的方法是首先检查SD卡是否存在,此程序中没有进行检测,因为我只是在练习相机的使用。


检测代码如下:


代码


if (Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
? ? ? ? File? ? sdcardPath = Environment.getExternalStorageDirectory();
? ? ? ? ? ? setTitle(sdcardPath.getName()); //将SD卡路径名字设置为标题,只是为了让大家看的更明白些
? ? ? ? } else {
? ? ? ? ? ? Toast.makeText(RecordTest.this, "没有SD卡", 1000).show();
? ? ? ? }


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇如何实现Android手机摄像头的自动.. 下一篇Bash多进程批量处理

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: