Android中拍照和录像功能

来源:互联网 发布:英语四级真题推荐知乎 编辑:程序博客网 时间:2024/05/21 07:56

目前Android中有很多项目需要实现拍照及录像功能,通常都使用camera和sufaceView实现,整个过程较为繁琐,并且代码量比较大。偶然在github上发现一个很好用的框架,在这里做一个简单介绍,后附github地址。

gif:


原项目中没有照明功能,由于项目中定义的camera我私有变量,如果需要照明功能的同学可以下载demo中的library,不需要的同学可以直接添加引用:

[java] view plain copy
  1. compile 'com.flurgle:camerakit:0.9.17'  

cameraview中拍照的图片一般在1M左右,需要上传的话最好先进行压缩,这里我引用了另一个github上的压缩工具,gradle引用:

[java] view plain copy
  1. //图片压缩  
  2. compile 'id.zelory:compressor:2.0.0'  

下面进入实际使用,首先是拍照和录像监听

[java] view plain copy
  1. mCameraView.setCameraListener(new CameraListener() {  
  2.     @Override  
  3.     public void onPictureTaken(final byte[] jpeg) {  
  4.         super.onPictureTaken(jpeg);  
  5.         new Thread(new Runnable() {  
  6.             @Override  
  7.             public void run() {  
  8.                 //将cameraview获得的byte数组存储到File文件中:  
  9.                 File file = CameraUtils.getFile(jpeg, getExternalCacheDir().getAbsolutePath(), System.currentTimeMillis() + "_original.jpg");  
  10.                 try {  
  11.                     //调用压缩方法进行压缩  
  12.                     final File compressedImageFile = new Compressor(MainActivity.this).setDestinationDirectoryPath(file.getParent()).compressToFile(file);  
  13.                     Log.i(TAG,"图片保存的地址为:"+compressedImageFile.getAbsolutePath()+compressedImageFile.exists());  
  14.                     runOnUiThread(new Runnable() {  
  15.                         @Override  
  16.                         public void run() {  
  17.                             Toast.makeText(MainActivity.this,"拍照成功,地址为:"+compressedImageFile.getAbsolutePath()+compressedImageFile.exists(), Toast.LENGTH_SHORT).show();  
  18.                         }  
  19.                     });  
  20.                 } catch (IOException e) {  
  21.                     e.printStackTrace();  
  22.                 }  
  23.             }  
  24.         }).start();  
  25.   
  26.     }  
  27.   
  28.     @Override  
  29.     public void onVideoTaken(final File video) {  
  30.         super.onVideoTaken(video);  
  31.         runOnUiThread(new Runnable() {  
  32.             @Override  
  33.             public void run() {  
  34.                 Toast.makeText(MainActivity.this,"录制成功,地址为:"+video.getAbsolutePath(), Toast.LENGTH_SHORT).show();  
  35.             }  
  36.         });  
  37.   
  38.         Log.i(TAG,"视频保存的地为:"+video.getAbsolutePath());  
  39.     }  
  40. });  

将cameraview获得的byte数组存储到File文件中:

[java] view plain copy
  1. public static File getFile(byte[] bfile, String filePath, String fileName) {  
  2.       BufferedOutputStream bos = null;  
  3.       FileOutputStream fos = null;  
  4.       File file = null;  
  5.       try {  
  6.           File dir = new File(filePath);  
  7.           if(!dir.exists()||dir.isDirectory()){//判断文件目录是否存在  
  8.               dir.mkdirs();  
  9.           }  
  10.           file = new File(filePath+"/"+fileName);  
  11.           fos = new FileOutputStream(file);  
  12.           bos = new BufferedOutputStream(fos);  
  13.           bos.write(bfile);  
  14.   
  15.       } catch (Exception e) {  
  16.           e.printStackTrace();  
  17.       } finally {  
  18.           if (bos != null) {  
  19.               try {  
  20.                   bos.close();  
  21.               } catch (IOException e1) {  
  22.                   e1.printStackTrace();  
  23.               }  
  24.           }  
  25.           if (fos != null) {  
  26.               try {  
  27.                   fos.close();  
  28.               } catch (IOException e1) {  
  29.                   e1.printStackTrace();  
  30.               }  
  31.           }  
  32.           return file;  
  33.       }  
  34.   }  

compressedImageFile就是需要的图片    video就是需要的MP4文件。

以下是常用的一些方法,更多的方法可以去github上面查阅:

[java] view plain copy
  1. //开启照明  
  2. //本方法需要修改library中的部分代码,使外面可以获取到cameraView所引用的Camera,通过gradle引用无法直接使用  
  3. //需要照明的同学,可以下载demo 直接使用library  
  4. public void light(View view) {  
  5.     CameraUtils.flashControl(mCameraView);  
  6.     isLight =!isLight;  
  7. }  
  8. //拍照/录像  
  9. public void takephoto(View view) {  
  10.     if (isPhoto){  
  11.         mCameraView.captureImage();  
  12.     }else {  
  13.         if (!isVideoStarted) {  
  14.             Toast.makeText(this"录像开始", Toast.LENGTH_SHORT).show();  
  15.             mCameraView.startRecordingVideo();  
  16.         }else {  
  17.             mCameraView.stopRecordingVideo();  
  18.         }  
  19.         isVideoStarted =!isVideoStarted;  
  20.     }  
  21. }  
  22. //切换模式  
  23. public void type(View view) {  
  24.     ((ImageView)view).setImageResource(  
  25.             isPhoto ?  
  26.                     R.drawable.icon_photograp_photo :  
  27.                     R.drawable.icon_photograp_video);  
  28.   
  29.         isPhoto =!isPhoto;  
  30.     if (isPhoto){  
  31.         Toast.makeText(this"已经切换到拍照模式", Toast.LENGTH_SHORT).show();  
  32.     }else Toast.makeText(this"已经切换到录像模式", Toast.LENGTH_SHORT).show();  
  33. }  
  34. //前后置切换  
  35. public void font_back(View view) {  
  36.     mCameraView.setFacing(isFont? CameraKit.Constants.FACING_BACK:CameraKit.Constants.FACING_FRONT);  
  37.     isFont=!isFont;  
  38. }  
  39. //拍照的时候开启闪光灯  
  40. public void flash(View view) {  
  41.     mCameraView.setFlash(isFlash ?CameraKit.Constants.FLASH_OFF:CameraKit.Constants.FLASH_ON);  
  42.     isFlash =!isFlash;  
  43. }  
  44. //缩放  
  45. public void zoom(View view) {  
  46.     mCameraView.setMethod(isStandard ?CameraKit.Constants.METHOD_STILL:CameraKit.Constants.METHOD_STANDARD);  
  47.     isStandard =!isStandard;  
  48. }  

调用照明方法:

[java] view plain copy
  1. public static boolean flashControl(CameraView cameraView) {  
  2.        Camera.Parameters parameters =cameraView.getCamera().getParameters();  
  3.        if (Camera.Parameters.FLASH_MODE_OFF.equals(parameters.getFlashMode())) {  
  4.            parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);  
  5.            cameraView.getCamera().setParameters(parameters);  
  6.            return true;  
  7.        } else if (Camera.Parameters.FLASH_MODE_TORCH.equals(parameters.getFlashMode())) {  
  8.            parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);  
  9.            cameraView.getCamera().setParameters(parameters);  
  10.        }  
  11.        return false;  
  12.    }  

github地址:

CameraKit-android:https://github.com/gogopop/CameraKit-Android

Compressor:https://github.com/zetbaitsu/Compressor


demo下载地址在此  拍照录像demo