自定义Camera之简单介绍

拍照界面:

因为取景框要有实时刷新的效果所以普通的view不行,一般使用surfaceView

上面的按钮是拍照按钮

[java]  view plain  copy
 print ?
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical"  
  6.     tools:context="com.example.cameratest1.MyCamera" >  
  7.   
  8.     <Button  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:onClick="capture"  
  12.         android:text="Capture" />  
  13.   
  14.     <SurfaceView  
  15.         android:id="@+id/preview"  
  16.         android:layout_width="match_parent"  
  17.         android:layout_height="match_parent" />  
  18.   
  19. </LinearLayout>  

然后写一个Activity实现拍照的逻辑控制,MyCamera,

实现几个方法

拍照按钮点击事件

public void capture(View view){}

 获取Camera对象方法

private Camera getCamera(){}

开始预览相机内容方法,将Camera与SurfaceView进行绑定,
使Camera的实时预览效果显示在SurfaceView
 中

private void setStartPreview(Camera camera,SurfaceHolder holder){}

* 释放系统相机资源
private void releaseCamera(){}

全部代码

[java]  view plain  copy
 print ?
  1. public class MyCamera extends Activity implements SurfaceHolder.Callback{  
  2.   
  3.     private Camera mCamera;  
  4.     private SurfaceView mPreview;  
  5.   
  6.     private SurfaceHolder mHolder;  
  7.     private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {  
  8.   
  9.         @Override  
  10.         public void onPictureTaken(byte[] data, Camera camera) {  
  11.             // TODO Auto-generated method stub  
  12.             //这里的data是真实图片数据不是缩略图  
  13.             File tempFile = new File("/sdcard/tddemp.png");  
  14.             try {  
  15.                 FileOutputStream fos = new FileOutputStream(tempFile);  
  16.                 fos.write(data);//将拍到的数据写入文件  
  17.                 fos.close();  
  18.                 //将拍到的数据传递到resultActivity中显示出来  
  19.                 Intent intent = new Intent(MyCamera.this, ResultActivity.class);  
  20.                 intent.putExtra("picPath", tempFile.getAbsolutePath());  
  21.                 startActivity(intent);  
  22.                 MyCamera.this.finish();  
  23.             } catch (FileNotFoundException e) {  
  24.                 // TODO Auto-generated catch block  
  25.                 e.printStackTrace();  
  26.             } catch (IOException e) {  
  27.                 // TODO Auto-generated catch block  
  28.                 e.printStackTrace();  
  29.             }  
  30.         }  
  31.     };  
  32.     @Override  
  33.     protected void onCreate(Bundle savedInstanceState) {  
  34.         super.onCreate(savedInstanceState);  
  35.         setContentView(R.layout.activity_my_camera);  
  36.         mPreview = (SurfaceView) findViewById(R.id.preview);  
  37.         mHolder = mPreview.getHolder();  
  38.         mHolder.addCallback(this);  
  39.     }  
  40.     public void capture(View view){  
  41.         //设置拍照参数  
  42.         Camera.Parameters parameters = mCamera.getParameters();  
  43.         parameters.setPictureFormat(ImageFormat.JPEG);//设置拍照格式  
  44.         parameters.setPictureSize(800400);//设置拍照大小  
  45.         parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);//设置自动对焦  
  46.         //获取最清晰的焦距  
  47.         mCamera.autoFocus(new Camera.AutoFocusCallback() {  
  48.   
  49.             @Override  
  50.             public void onAutoFocus(boolean success, Camera camera) {  
  51.                 // TODO Auto-generated method stub  
  52.                 if (success) {  
  53.                     mCamera.takePicture(nullnull, mPictureCallback);  
  54.                     //第三个参数是回调方法  
  55.                 }  
  56.   
  57.             }  
  58.         });  
  59.   
  60.     }  
  61.   
  62.     /** 
  63.      * 使用系统相机需要以下方法 
  64.      */  
  65.     /** 
  66.      * 获取Camera对象 
  67.      * @return 
  68.      */  
  69.     private Camera getCamera(){  
  70.         //这里使用导入的是硬件的Camera,import android.hardware.Camera;  
  71.         Camera camera;  
  72.         camera = Camera.open();  
  73.         return camera;  
  74.     }  
  75.     /** 
  76.      * 开始预览相机内容,将Camera与SurfaceView进行绑定, 
  77.      * 使Camera的实时预览效果显示在SurfaceView 
  78.      * 中 
  79.      */  
  80.     private void setStartPreview(Camera camera,SurfaceHolder holder){  
  81.         try {  
  82.             camera.setPreviewDisplay(holder);  
  83.             camera.startPreview();  
  84.             camera.setDisplayOrientation(90);//系统默认显示横屏的Camera,旋转为竖屏  
  85.         } catch (IOException e) {  
  86.             // TODO Auto-generated catch block  
  87.             e.printStackTrace();  
  88.         }  
  89.     }  
  90.     /** 
  91.      * 释放系统相机资源 
  92.      */  
  93.     private void releaseCamera(){  
  94.   
  95.         if (mCamera!=null) {  
  96.             mCamera.setPreviewCallback(null);//去掉回调,取消与SuferView的关联  
  97.             mCamera.stopPreview();//停止取景  
  98.             mCamera.release();  
  99.             mCamera =null;  
  100.         }  
  101.   
  102.     }  
  103.     /** 
  104.      * 将Camera的生命周期与Activity的生命周期进行绑定 
  105.      */  
  106.     @Override  
  107.     protected void onResume() {  
  108.         // TODO Auto-generated method stub  
  109.         super.onResume();  
  110.         if (mCamera == null) {  
  111.             mCamera = getCamera();  
  112.             if(mHolder != null){  
  113.                 setStartPreview(mCamera, mHolder);  
  114.             }  
  115.         }  
  116.     }  
  117.     @Override  
  118.     protected void onPause() {  
  119.         // TODO Auto-generated method stub  
  120.         super.onPause();  
  121.         releaseCamera();  
  122.   
  123.     }  
  124.     @Override  
  125.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  126.             int height) {  
  127.         // TODO Auto-generated method stub  
  128.         //重启  
  129.         mCamera.stopPreview();  
  130.         setStartPreview(mCamera, mHolder);  
  131.     }  
  132.     @Override  
  133.     public void surfaceCreated(SurfaceHolder holder) {  
  134.         // TODO Auto-generated method stub  
  135.         setStartPreview(mCamera, mHolder);  
  136.     }  
  137.     @Override  
  138.     public void surfaceDestroyed(SurfaceHolder holder) {  
  139.         // TODO Auto-generated method stub  
  140.         releaseCamera();  
  141.     }  
  142. }  

写一个ResultActivity,这样在拍照界面点击拍照按钮后,将图片在ResultActivtiy中获取显示


[java]  view plain  copy
 print ?
  1. public class ResultActivity extends Activity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_result);  
  7.         String path = getIntent().getStringExtra("picPath");  
  8.   
  9.         ImageView imageView = (ImageView) findViewById(R.id.pic);  
  10.   
  11.         try {  
  12.             FileInputStream fis = new FileInputStream(path);  
  13.             Bitmap bitmap = BitmapFactory.decodeStream(fis);  
  14.             /** 
  15.              * 让图像显示为竖屏,拍照时默认系统取景为横屏,存储的也是横屏的数据,这里需要做如下处理 
  16.              */  
  17.             Matrix matrix = new Matrix();//矩阵  
  18.             matrix.setRotate(90);//通过变换矩阵旋转角度  
  19.             bitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix, true);  
  20.             imageView.setImageBitmap(bitmap);  
  21.         } catch (FileNotFoundException e) {  
  22.             // TODO Auto-generated catch block  
  23.             e.printStackTrace();  
  24.         }  
  25.         //      Bitmap bitmap = BitmapFactory.decodeFile(path);  
  26.         //      imageView.setImageBitmap(bitmap);  
  27.   
  28.     }  
  29. }  

你可能感兴趣的:(自定义Camera之简单介绍)