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创建时,建立Camera和SurfaceView的联系 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; } } }
安卓笔记 自定义相机
最新推荐文章于 2024-06-14 11:17:39 发布