Android之使用摄像头拍照

来源:互联网 发布:hadoop存入数据 编辑:程序博客网 时间:2024/04/28 07:26

转载自:http://blog.csdn.net/kesenhoo


直接使用代码演示:

【0】Manifest文件

view plain
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="com.hoo.picture"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  7.         <activity android:name="TakePhotoActivity"  
  8.                   android:label="@string/app_name"   
  9.                   android:screenOrientation="landscape">  
  10.             <intent-filter>  
  11.                 <action android:name="android.intent.action.MAIN" />  
  12.                 <category android:name="android.intent.category.LAUNCHER" />  
  13.             </intent-filter>  
  14.         </activity>  
  15.     </application>  
  16.     <uses-sdk android:minSdkVersion="7" />  
  17. <!-- 访问摄像头的权限 -->  
  18. <uses-permission android:name="android.permission.CAMERA"/>  
  19. <!-- 在SDCard中创建与删除文件权限 -->  
  20. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
  21. <!-- 往SDCard写入数据权限 -->  
  22. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
  23. </manifest>   
  

【1】为主界面添加SurfaceView控件

view plain
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7. <SurfaceView  
  8.     android:layout_width="fill_parent"   
  9.     android:layout_height="fill_parent"   
  10.     android:id="@+id/surfaceView"  
  11.     />  
  12. </LinearLayout>  
 

【2】TakePhotoActivity.java

view plain
  1. /** 
  2.  * 拍照功能 
  3.  * @author kay 
  4.  */  
  5. public class TakePhotoActivity extends Activity   
  6. {  
  7.     private static final String TAG = "TakeActivity";  
  8.     private SurfaceView surfaceView;  
  9.     private Camera camera;  
  10.     private boolean preview;  
  11.     @Override  
  12.     public void onCreate(Bundle savedInstanceState)   
  13.     {  
  14.         super.onCreate(savedInstanceState);  
  15.         Window window = getWindow();  
  16.         //设置没有标题  
  17.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  18.         //设置全屏  
  19.         window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  20.         //设置高亮  
  21.         window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);  
  22.         setContentView(R.layout.main);          
  23.         surfaceView =(SurfaceView)this.findViewById(R.id.surfaceView);  
  24.         //设置分辨率  
  25.         surfaceView.getHolder().setFixedSize(176144);   
  26.         //设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前  
  27.         surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  28.         surfaceView.getHolder().addCallback(new SurfaceCallback());  
  29.     }  
  30.    
  31.     private final class SurfaceCallback implements SurfaceHolder.Callback  
  32.     {  
  33.           
  34.         //画面变化时  
  35.         @Override  
  36.         public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  37.                 int height)   
  38.         {     
  39.         }  
  40.         //画面创建时  
  41.         @Override  
  42.         public void surfaceCreated(SurfaceHolder holder)   
  43.         {  
  44.             try   
  45.             {  
  46.                 //打开摄像头  
  47.                 camera = Camera.open();  
  48.                 WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);  
  49.                 Display display = wm.getDefaultDisplay();  
  50.                 //构造摄像头参数  
  51.                 Camera.Parameters parameters = camera.getParameters();  
  52.                 //设置预览照片的大小  
  53.                 parameters.setPreviewSize(display.getWidth(), display.getHeight());  
  54.                 //设置每秒3帧  
  55.                 parameters.setPreviewFrameRate(3);  
  56.                 //设置照片的输出格式  
  57.                 parameters.setPictureFormat(PixelFormat.JPEG);  
  58.                 //设置照片质量  
  59.                 parameters.set("jpeg-quality"85);  
  60.                 //设置照片的大小  
  61.                 parameters.setPictureSize(display.getWidth(), display.getHeight());  
  62.                 //设置摄像头参数  
  63.                 camera.setParameters(parameters);  
  64.                 //通过SurfaceView显示取景画面  
  65.                 camera.setPreviewDisplay(surfaceView.getHolder());  
  66.                 //开始预览照片  
  67.                 camera.startPreview();  
  68.                 preview = true;  
  69.             }  
  70.             catch (IOException e)   
  71.             {  
  72.                 Log.e(TAG, e.toString());  
  73.             }  
  74.         }  
  75.           
  76.         //画面关闭时  
  77.         @Override  
  78.         public void surfaceDestroyed(SurfaceHolder holder)   
  79.         {  
  80.             if(camera!=null)  
  81.             {  
  82.                 if(preview) camera.stopPreview();  
  83.                 camera.release();  
  84.             }  
  85.         }  
  86.     }  
  87.       
  88.     //重写手机按钮事件  
  89.     @Override  
  90.     public boolean onKeyDown(int keyCode, KeyEvent event)  
  91.     {  
  92.         if(camera!=null && event.getRepeatCount()==0)  
  93.         {  
  94.             switch (keyCode)   
  95.             {  
  96.                 case KeyEvent.KEYCODE_SEARCH:  
  97.                     camera.autoFocus(null);//自动对焦  
  98.                     break;  
  99.                 //按下拍照键或者中间键,则拍照  
  100.                 case KeyEvent.KEYCODE_CAMERA:  
  101.                 case KeyEvent.KEYCODE_DPAD_CENTER:  
  102.                     //此方法是异步的,不能在后面添加其他数据  
  103.                     camera.takePicture(nullnullnew TakePictureCallback());  
  104.                     break;  
  105.             }  
  106.         }  
  107.         return true;  
  108.     }  
  109.       
  110.     //使用内部类,拍照回调  
  111.     private final class TakePictureCallback implements PictureCallback  
  112.     {  
  113.         @Override  
  114.         public void onPictureTaken(byte[] data, Camera camera)   
  115.         {  
  116.             try   
  117.             {  
  118.                 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);  
  119.                 File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+".jpg");  
  120.                 FileOutputStream outStream = new FileOutputStream(file);  
  121.                 //压缩文件  
  122.                 bitmap.compress(CompressFormat.JPEG, 100, outStream);  
  123.                 outStream.close();  
  124.                 //关闭预览  
  125.                 camera.stopPreview();  
  126.                 //重新开始预览  
  127.                 camera.startPreview();  
  128.             }  
  129.             catch (Exception e)   
  130.             {  
  131.                 Log.e(TAG, e.toString());  
  132.             }  
  133.         }  
  134.     }      
  135. }  

原创粉丝点击