欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 简单的照相机程序的实例代码

程序员文章站 2023-11-16 17:29:28
复制代码 代码如下:class surface extends surfaceview implements surfaceholder.callback { &...

复制代码 代码如下:

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卡,则需要添加以下权限:

复制代码 代码如下:

android:name="android.permission.write_external_storage">

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

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

如果没有这两条权限的话,会报错,具体错误可以在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();
        }