• android 实现拍照的2种方法


    android系统的照相功能,已实现2种方法,可供大家参考:

    1.调用系统摄像头来拍照

    首先,找到AndroidManifest.xml文件里加入用户权限

    <uses-permission android:name="android.permission.CAMERA"></uses-permission>

     <uses-feature android:name="android.hardware.camera" />
     <uses-feature android:name="android.hardware.camera.autofocus" />

    其次,在主类java文件里加入2个控件(button和imageview),是用来触发按钮事件和显示图片的,纯是个人爱好

    final int TAKE_PICTURE = 1;//为了表示返回方法中辨识你的程序打开的相机

    关键是这里:startActivityForResult(new Intent("android.media.action.IMAGE_CAPTURE"), TAKE_PICTURE);

    是打开系统自带相机,以下是处理拍照得到的数据,将数据保存下来

        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == TAKE_PICTURE) {
                if (resultCode == RESULT_OK) {
                    Bitmap bm = (Bitmap) data.getExtras().get("data");
                    img.setImageBitmap(bm);//想图像显示在ImageView视图上,private ImageView img;
                    File myCaptureFile = new File("sdcard/123456.jpg");
                    try {
         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
          /* 采用压缩转档方法 */
               bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
               
               /* 调用flush()方法,更新BufferStream */
               bos.flush();
               
               /* 结束OutputStream */
               bos.close();
        } catch (FileNotFoundException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
         
        } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        }
                }
            }
    }

    这样就能实现调用系统自带的摄像头了,很简单的操作。

    2.自己写程序来保存照片

    照片格局文件lay.xml里要先进行这些定义

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
    >
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="130px"
        android:paddingRight="200px"
      >
      <SurfaceView
        android:id="@+id/mSurfaceView1"
        android:visibility="visible" 
        android:layout_width="320px" 
        android:layout_height="240px">
      </SurfaceView> 
      </LinearLayout>
      </LinearLayout>

    其中SurfaceView是用来进行预览的,

    在Oncreat函数里初始化一系列的值:

     requestWindowFeature(Window.FEATURE_NO_TITLE);
     setContentView(R.layout.lay);

     /* 取得屏幕解析像素 */
         DisplayMetrics dm = new DisplayMetrics();
         getWindowManager().getDefaultDisplay().getMetrics(dm);
        // mImageView01 = (ImageView) findViewById(R.id.myImageView1);
         
         /* 以SurfaceView作为相机Preview之用 */
         mSurfaceView01 = (SurfaceView) findViewById(R.id.mSurfaceView1);
         
         /* 绑定SurfaceView,取得SurfaceHolder对象 */
         mSurfaceHolder01 = mSurfaceView01.getHolder();
         
         /* Activity必须实现SurfaceHolder.Callback */
         mSurfaceHolder01.addCallback(takephoto.this);
         
         /*
          * 以SURFACE_TYPE_PUSH_BUFFERS(3)
          * 作为SurfaceHolder显示类型 
          * */
         mSurfaceHolder01.setType
         (SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    首先进行初始化照相机的功能函数和参数设置:

    private Camera mCamera01;

    mCamera01 = Camera.open();

     /* 创建Camera.Parameters对象 */
        Camera.Parameters parameters = mCamera01.getParameters();
             
        /* 设置相片格式为JPEG */
        parameters.setPictureFormat(PixelFormat.JPEG);
        Log.i(TAG, "pic is jpeg");
             
        /* 指定preview的屏幕大小 */
        parameters.setPreviewSize(320, 240);
        Log.i(TAG, "pic pingmu fenbianlv");
             
        /* 设置图片分辨率大小 */
        parameters.setPictureSize(1024, 768);
        Log.i(TAG, "pic tupian fenbianlv");
             
        /* 将Camera.Parameters设置予Camera */
        mCamera01.setParameters(parameters);
             
        /* setPreviewDisplay唯一的参数为SurfaceHolder */
        mCamera01.setPreviewDisplay(mSurfaceHolder01);
             
        /* 立即运行Preview */
        mCamera01.startPreview();

    初始化成功后就可以进行拍照了,拍照函数依然是通过调用camera类的函数来实现

    mCamera01.takePicture
           (shutterCallback, rawCallback, jpegCallback);

    只需实现jpegCallback这个回调函数来就行解码、保存即可,前2个参数可以直接设为null,不过系统一般会自动帮你把这些都写进来的

     private PictureCallback jpegCallback = new PictureCallback() 
       {
         public void onPictureTaken(byte[] _data, Camera _camera)
         {
           // TODO Handle JPEG image data
           
           /* onPictureTaken传入的第一个参数即为相片的byte */
           Bitmap bm = BitmapFactory.decodeByteArray
                       (_data, 0, _data.length);
           
           /* 创建新文件 */
                  picname = "sdcard/1234566.jpg";//要保存在哪里,路径你自己设
           File myCaptureFile = new File(picname);
           try
           {
             BufferedOutputStream bos = new BufferedOutputStream
             (new FileOutputStream(myCaptureFile));
             
             /* 采用压缩转档方法 */
             bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
             
             /* 调用flush()方法,更新BufferStream */
             bos.flush();
             
             /* 结束OutputStream */
             bos.close();
             
             /* 将拍照下来且存储完毕的图文件,显示出来 */ 
             //mImageView01.setImageBitmap(bm);
             
             /* 显示完图文件,立即重置相机,并关闭预览 */
             resetCamera();
             
              }
           catch (Exception e)
           {
             Log.e(TAG, e.getMessage());
           }
         }
       };

    拍照完了要重置照相机,然后可以继续拍照

    /* 相机重置 */
       private void resetCamera()
       {
         if (mCamera01 != null && bIfPreview)
         {
           mCamera01.stopPreview();
           /* 扩展学习,释放Camera对象 */
           mCamera01.release();
           mCamera01 = null;
           bIfPreview = false;
         }
       }

    2种拍照方式的比较

    1.调用系统自带的照相机,照片格式大小只有几种选择,照片拍出来比较大,而自己程序实现的话可以调节照片大小为任意尺寸,图片的容量可以调节

    2.调用系统的简单,而且外观一般比自己设置的要好看

    3.调用系统的操作简单、方便,不易出错,自己编程的话需要注意,容易引起系统出错意外终止

    http://blog.csdn.net/napolun007/article/details/6103307

  • 相关阅读:
    Linux安全加固
    mosquitto
    Docker设置2375端口
    linux shell 常见的时间戳操作
    tar打包并且排除log目录
    spring boot2整合shiro安全框架实现前后端分离的JWT token登录验证
    http post
    scp命令 Linux和Windows文件互传
    git did not exit cleanly (exit code 1) 的解决办法
    windows安装TortoiseGit详细使用教程【基础篇】
  • 原文地址:https://www.cnblogs.com/cmblogs/p/4425067.html
Copyright © 2020-2023  润新知