(六)相机程序开发

今天我们来讲一下在 Android 平台上开发相机的问题!Two choices!
第一种使用intent方法来调用系统方法
一般以动作按钮的方式来操作,101仅作为一个标示
[java]   view plain   copy
  print?
  1. Button button =new Button(this);  
  2. button.setOnClickListener(new OnClickListener() {  
  3.       
  4.     @Override  
  5.     public void onClick(View v) {  
  6.         // TODO Auto-generated method stub  
  7.         //打开系统相机,拍照数据存在mCurrentPhotoFile里里  
  8.         Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
  9.         intent.putExtra(MediaStore.EXTRA_OUTPUT,  
  10.                 Uri.fromFile(mCurrentPhotoFile));  
  11.         startActivityForResult(intent, 101);  
  12.     }  
  13. });  

实现Activity里的onActivityResult
[java]   view plain   copy
  print?
  1. /* 反应事件 */  
  2. @Override  
  3. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  4.     //RESULT_OK是个系统变量,代表操作成功,那么我们就可以进行下面的操作了。  
  5.     if (resultCode != Activity.RESULT_OK) {  
  6.         return;  
  7.     }  
  8.     switch (requestCode) {  
  9.     /* 拍照 */  
  10.     case 101:  
  11.         //保存了data就保存了图片  
  12.         super.onActivityResult(requestCode, resultCode, data);  
  13.         break;  
  14.     }  
  15. }  


第二种自定义相机
1、从xml文件中得到surfaceview对象
[html]   view plain   copy
  print?
  1. surfaceView = (SurfaceView) findViewById(R.id.g3_server_preview);  
2、之后声明一些回调方法,用于打开相机,设置相机的参数(在这里可以设置图片的尺寸,以及预览界面的尺寸)
[html]   view plain   copy
  print?
  1. // SurfaceHodler 回调,处理打开相机,关闭相机以及照片尺寸的改变  
  2.     SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {  
  3.         @Override  
  4.         public void surfaceCreated(SurfaceHolder holder) {  
  5.             // 打开相机  
  6.             camera = Camera.open();  
  7.             try {  
  8.                 // 设置预览  
  9.                 camera.setPreviewDisplay(holder);  
  10.             } catch (IOException e) {  
  11.                 e.printStackTrace();  
  12.             }  
  13.         }  
  14.   
  15.         @Override  
  16.         public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  17.                 int height) {  
  18.             // 获得相机参数  
  19.             Camera.Parameters parameters = camera.getParameters();  
  20.             // SDK版本选择,兼容  
  21.             if (Integer.parseInt(Build.VERSION.SDK) >= 8) {  
  22.                 setDisplayOrientation(camera, 90);  
  23.             } else {  
  24.                 if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {  
  25.                     parameters.set("orientation", "portrait");  
  26.                     parameters.set("rotation", 90);  
  27.                 }  
  28.                 if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {  
  29.                     parameters.set("orientation", "landscape");  
  30.                     parameters.set("rotation", 90);  
  31.                 }  
  32.             }  
  33.             // 设置预览大小  
  34.             parameters.setPreviewSize(width, height);  
  35.             pic_Width = g3_setting.getInt(AppData.G3_PIC_WIDTH, 640);  
  36.             pic_Height = g3_setting.getInt(AppData.G3_PIC_HEIGHT, 800);  
  37.             Log.i("Travel", pic_Width + ":" + pic_Height);  
  38.             // 设置照片大小  
  39.             parameters.setPictureSize(pic_Width, pic_Height);  
  40.             // 设置照片格式  
  41.             // parameters.setPictureFormat(PixelFormat.RGB_565);  
  42.             // 开始预览  
  43.             camera.startPreview();  
  44.             // 设置相机参数  
  45.             camera.setParameters(parameters);  
  46.         }  
  47.   
  48.         @Override  
  49.         public void surfaceDestroyed(SurfaceHolder holder) {  
  50.             // 停止预览  
  51.             if (camera != null) {  
  52.                 camera.stopPreview();  
  53.                 // 释放相机资源  
  54.                 camera.release();  
  55.                 camera = null;  
  56.             }  
  57.         }  
  58.     };  
  59.     protected void setDisplayOrientation(Camera camera, int angle) {  
  60.         Method downPolymorphic;  
  61.         try {  
  62.             downPolymorphic = camera.getClass().getMethod(  
  63.                     "setDisplayOrientation", new Class[] { int.class });  
  64.             if (downPolymorphic != null)  
  65.                 downPolymorphic.invoke(camera, new Object[] { angle });  
  66.         } catch (Exception e1) {  
  67.         }  
  68.     }  
3、然后设置surfaceview参数,加载回调方法
[html]   view plain   copy
  print?
  1. // 设置屏幕常亮  
  2. surfaceView.setKeepScreenOn(true);  
  3. surfaceView.setFocusable(true);  
  4. releaseCamera();  
  5. // 从SurfaceView中获得SurfaceHolder  
  6. surfaceView.getHolder().addCallback(surfaceCallback);  
  7. // 为SurfaceHolder 添加回调  
  8. // surfaceHolder.addCallback(surfaceCallback);  
  9. surfaceView.getHolder()  
  10.         .setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
释放相机资源
[html]   view plain   copy
  print?
  1. private void releaseCamera() {  
  2.     // TODO Auto-generated method stub  
  3.     if (camera != null) {  
  4.         camera.stopPreview();  
  5.         // 释放相机资源  
  6.         camera.release();  
  7.         camera = null;  
  8.     }  
  9. }  

4、配置相机响声音还是震动的回调方法
[html]   view plain   copy
  print?
  1. Camera.ShutterCallback shutter = new ShutterCallback() {  
  2.   
  3.         @Override  
  4.         public void onShutter() {  
  5.             // TODO Auto-generated method stub  
  6.             if (tone == null) {  
  7.                 // 发出提示用户的声音  
  8.                 tone = new ToneGenerator(AudioManager.STREAM_SYSTEM,  
  9.                         ToneGenerator.MAX_VOLUME);  
  10.             }  
  11.             if (g3_setting.getBoolean(AppData.G3_CONFIG_AUDIO, true)) {  
  12.                 tone.startTone(ToneGenerator.TONE_PROP_BEEP);  
  13.             } else {  
  14.                 tone.stopTone();  
  15.                 Vibrator vibrator = (Vibrator) context  
  16.                         .getSystemService(Service.VIBRATOR_SERVICE);  
  17.                 vibrator.vibrate(100);  
  18.             }  
  19.         }  
  20.     };  


小插曲,判断系统声音能否关闭
[html]   view plain   copy
  print?
  1. File file = new File("/system/media/audio/ui/Camera_click.ogg");  
  2.         if (!file.canWrite()) {  
  3.             Tools.showToast(context, "设置声音无效!");  
  4.         } else {  
  5.             file.renameTo(new File("/system/media/audio/ui/Camera_click.ogg1"));  
  6.         }  
5、自动对焦并拍照
[html]   view plain   copy
  print?
  1. // 对焦成功再拍照  
  2.             camera.autoFocus(new AutoFocusCallback() {  
  3.   
  4.                 @Override  
  5.                 public void onAutoFocus(boolean success, Camera camera) {  
  6.                     // TODO Auto-generated method stub  
  7.                     // success为true表示对焦成功  
  8.                     if (success) {  
  9.                         if (camera != null) {  
  10.                             // 停止预览  
  11.                             camera.stopPreview();  
  12.                             // 拍照  
  13.                             camera.takePicture(shutter, null, pictureCallback);  
  14.                         }  
  15.                     }  
  16.                 }  
  17.             });  
  18.   
  19.     // 照片回调  
  20.     Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {  
  21.         @Override  
  22.         public void onPictureTaken(byte[] data, Camera camera) {  
  23.             Log.i("G3", "picture operating.............");  
  24.             new SavePictureTask().execute(data);  
  25.             camera.startPreview();  
  26.         }  
  27.     };  
  28.   
  29.     // 保存照片任务类  
  30.     class SavePictureTask extends AsyncTask<byte[], String, String> {  
  31.         @Override  
  32.         protected String doInBackground(byte[]... params) {  
  33.             Log.i("G3", "picture saving.............");  
  34.             File path = new File(Tools.getSDPath());  
  35.             if (!path.exists()) {  
  36.                 path.mkdirs();  
  37.             }  
  38.             // 创建文件  
  39.             File picture = new File(Tools.getSDPath(), Tools.initPhotoName());  
  40.             try {  
  41.                 // 获得文件输出流  
  42.                 FileOutputStream fos = new FileOutputStream(picture.getPath());  
  43.                 // 写到该文件  
  44.                 fos.write(params[0]);  
  45.                 // 关闭文件流  
  46.                 fos.close();  
  47.             } catch (Exception e) {  
  48.                 e.printStackTrace();  
  49.             }  
  50.             return null;  
  51.         }  
  52.     }  
6、注意事项:
a.本项目代码已经实现对焦功能,如果你的相机不能对焦,那是手机本身不支持,与硬件有关
b.分辨率的设置,在第3步的surfaceChanged方法里已经实现,镜头和设置不能在同一界面,所以如果你实现此功能,还请指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值