安卓笔记 自定义相机

public class PositiveCameraActivity extends Activity implements Callback {
   private Context context;
   AppContext app;
   Camera camera = null;  
   MediaRecorder mediarecorder;
   private ImageView record;
   SurfaceView mpreview;
   private String mFileName;
   private OrientationEventListener mOrEventListener; // 设备方向监听器  
    private Boolean mCurrentOrientation=true; // 当前设备方向 横屏false,竖屏true 
    private String savePath = "/finger/";
   private boolean isSuccess=true;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.positive_pic);
      context = this;
      app=(AppContext)context.getApplicationContext();
      
      initView();    
   }

   void initView() {
      record = (ImageView) findViewById(R.id.btn_shutter);
      record.setOnClickListener(new OnClickListener() {
         @Override
         public void onClick(View v) {
            // TODO Auto-generated method stub
            if (isSuccess) {
               isSuccess=false;
               camera.autoFocus(new AutoFocusCallback() {

                  @Override
                  public void onAutoFocus(boolean success, Camera camera) {
                     // TODO Auto-generated method stub
                     if (success) {
                        if (camera != null) {
                           camera.takePicture(mShutter, null, mJpeg);
                        }
                     }else {
                        isSuccess=true;
                     }
                  }
               });
            }
         }
      });
      startOrientationChangeListener();
      mpreview = (SurfaceView) this.findViewById(R.id.positive_sur);
      SurfaceHolder mSurfaceHolder = mpreview.getHolder();
      mSurfaceHolder.addCallback(this);
      mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
   }
   
   @Override      
   public boolean onTouchEvent(MotionEvent event) {
      //屏幕触摸事件
      if (event.getAction() == MotionEvent.ACTION_DOWN) {
         //按下时自动对焦             
         camera.autoFocus(null);             
                }         
      return true;    
   }
   
   @Override
   public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
      // TODO Auto-generated method stub
      // SurfaceView尺寸发生改变时(首次在屏幕上显示同样会调用此方法),初始化mCamera参数,启动Camera预览
      Parameters parameters = camera.getParameters();// 获取mCamera的参数对象
      Size largestSize = getBestSupportedSize(parameters.getSupportedPreviewSizes());
      parameters.setPreviewSize(largestSize.width, largestSize.height);// 设置预览图片尺寸
      largestSize = getBestSupportedSize(parameters.getSupportedPictureSizes());// 设置捕捉图片尺寸
      parameters.setPictureSize(largestSize.width, largestSize.height);
      camera.setDisplayOrientation(90);
      camera.setParameters(parameters);
      try {
         camera.startPreview();
      } catch (Exception e) {
         if (camera != null) {
            camera.release();
            camera = null;
         }
      }
   }

   @Override
   public void surfaceCreated(SurfaceHolder holder) {
      // TODO Auto-generated method stub
      // SurfaceView创建时,建立CameraSurfaceView的联系
      if (camera != null) {
         try {
            camera.setPreviewDisplay(holder);
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }

   @Override
   public void surfaceDestroyed(SurfaceHolder holder) {
      // TODO Auto-generated method stub
      if (camera != null) {
         camera.stopPreview();
      }
   }

   /* 图像数据处理还未完成时的回调函数 */
   private Camera.ShutterCallback mShutter = new Camera.ShutterCallback() {
      @Override
      public void onShutter() {
         // 一般显示进度条
      }
   };
   /* 图像数据处理完成后的回调函数 */
   private Camera.PictureCallback mJpeg = new Camera.PictureCallback() {

      @Override
      public void onPictureTaken(byte[] data, Camera camera) {
         try {
            
            saveToSDCard(data);
         } catch (IOException e) {
            // TODO Auto-generated catch block
            
            e.printStackTrace();
         } // 保存图片到sd卡中
      }

   };
   private Size getBestSupportedSize(List<Size> sizes) {  
        // 取能适用的最大的SIZE  
        Size largestSize = sizes.get(0);  
        int largestArea = sizes.get(0).height * sizes.get(0).width;  
        for (Size s : sizes) {  
            int area = s.width * s.height;  
            if (area > largestArea) {  
                largestArea = area;  
                largestSize = s;  
            }  
        }  
        return largestSize;  
    }  

   
   /**  
     * 将拍下来的照片存放在SD卡中  
     * @param data    
     * @throws IOException  
     */    
    public void saveToSDCard(byte[] data) throws IOException {    
        //剪切为正方形  
        Bitmap bitmap = byteToBitmap(data);  
       //Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);  
        //生成文件  
        Date date = new Date();    
        String filename ="p1.jpg";    
        File fileFolder = new File(Environment.getExternalStorageDirectory()    
                + savePath);    
        if (!fileFolder.exists()) { // 如果目录不存在,则创建一个名为"finger"的目录    
            fileFolder.mkdir();    
        }    
        File jpgFile = new File(fileFolder, filename);    
        FileOutputStream outputStream = new FileOutputStream(jpgFile); // 文件输出流    
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);  
        outputStream.flush();  
        outputStream.close(); // 关闭输出流    
        
        Intent intent = new Intent();
      intent.putExtra("path", Environment.getExternalStorageDirectory() + savePath + filename);
      setResult(IdentityInfoActivity.RESULT_ON, intent);
      finish();
    }    
    private final void startOrientationChangeListener() {  
        mOrEventListener = new OrientationEventListener(this) {  
            @Override  
            public void onOrientationChanged(int rotation) {  
                if (((rotation >= 0) && (rotation <= 45)) || (rotation >= 315)  
                        || ((rotation >= 135) && (rotation <= 225))) {// portrait  
                    mCurrentOrientation = true;  
                    Log.i("tips", "竖屏");  
                } else if (((rotation > 45) && (rotation < 135))  
                        || ((rotation > 225) && (rotation < 315))) {// landscape  
                    mCurrentOrientation = false;  
                    Log.i("tips", "横屏");  
                }  
            }  
        };  
        mOrEventListener.enable();  
    }  
    /** 
     * 把图片byte流编程bitmap 
     * @param data 
     * @return 
     */  
    private Bitmap byteToBitmap(byte[] data){  
        Options options = new BitmapFactory.Options();  
        options.inJustDecodeBounds = true;  
        Bitmap b = BitmapFactory.decodeByteArray(data, 0, data.length,options);  
        int i = 0;  
        while (true) {  
            if ((options.outWidth >> i <= 1000)  
                    && (options.outHeight >> i <= 1000)) {  
                options.inSampleSize = (int) Math.pow(2.0D, i);  
                options.inJustDecodeBounds = false;  
                b = BitmapFactory.decodeByteArray(data, 0, data.length,options);  
                break;  
            }  
            i += 1;  
        }  
        return b;  
  
    }  
    @Override  
    public void onResume() {  
        super.onResume();  
        // 开启相机  
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {  
           camera = Camera.open(0);  
            // i=0 表示后置相机  
        } else  
           camera = Camera.open();  
    }  
  
    @Override  
    public void onPause() {  
        super.onPause();  
        // 释放相机  
        if (camera!= null) {  
           camera.release();  
           camera = null;  
        }  
    }  
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值