Android中調用CemeraView實現拍照和錄像

Android中調用CemeraView實現拍照和錄像

目前Android中有很多項目需要實現拍照及錄像功能,通常都使用camera和sufaceView實現,整個過程較為繁瑣,並且代碼量比較大。偶然在github上發現一個很好用的框架,在這裡做一個簡單介紹,後附github地址。

gif:

原項目中沒有照明功能,由於項目中定義的camera我私有變量,如果需要照明功能的同學可以下載demo中的library,不需要的同學可以直接添加引用:

compile 'com.flurgle:camerakit:0.9.17'  

cameraview中拍照的圖片一般在1M左右,需要上傳的話最好先進行壓縮,這裡我引用瞭另一個github上的壓縮工具,gradle引用:

//圖片壓縮  
compile 'id.zelory:compressor:2.0.0'  

下面進入實際使用,首先是拍照和錄像監聽

mCameraView.setCameraListener(new CameraListener() {  
    @Override  
    public void onPictureTaken(final byte[] jpeg) {  
        super.onPictureTaken(jpeg);  
        new Thread(new Runnable() {  
            @Override  
            public void run() {  
                //將cameraview獲得的byte數組存儲到File文件中:  
                File file = CameraUtils.getFile(jpeg, getExternalCacheDir().getAbsolutePath(), System.currentTimeMillis() + "_original.jpg");  
                try {  
                    //調用壓縮方法進行壓縮  
                    final File compressedImageFile = new Compressor(MainActivity.this).setDestinationDirectoryPath(file.getParent()).compressToFile(file);  
                    Log.i(TAG,"圖片保存的地址為:"+compressedImageFile.getAbsolutePath()+compressedImageFile.exists());  
                    runOnUiThread(new Runnable() {  
                        @Override  
                        public void run() {  
                            Toast.makeText(MainActivity.this,"拍照成功,地址為:"+compressedImageFile.getAbsolutePath()+compressedImageFile.exists(), Toast.LENGTH_SHORT).show();  
                        }  
                    });  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }).start();  
  
    }  
  
    @Override  
    public void onVideoTaken(final File video) {  
        super.onVideoTaken(video);  
        runOnUiThread(new Runnable() {  
            @Override  
            public void run() {  
                Toast.makeText(MainActivity.this,"錄制成功,地址為:"+video.getAbsolutePath(), Toast.LENGTH_SHORT).show();  
            }  
        });  
  
        Log.i(TAG,"視頻保存的地為:"+video.getAbsolutePath());  
    }  
});  

將cameraview獲得的byte數組存儲到File文件中:

public static File getFile(byte[] bfile, String filePath, String fileName) {  
      BufferedOutputStream bos = null;  
      FileOutputStream fos = null;  
      File file = null;  
      try {  
          File dir = new File(filePath);  
          if(!dir.exists()||dir.isDirectory()){//判斷文件目錄是否存在  
              dir.mkdirs();  
          }  
          file = new File(filePath+"/"+fileName);  
          fos = new FileOutputStream(file);  
          bos = new BufferedOutputStream(fos);  
          bos.write(bfile);  
  
      } catch (Exception e) {  
          e.printStackTrace();  
      } finally {  
          if (bos != null) {  
              try {  
                  bos.close();  
              } catch (IOException e1) {  
                  e1.printStackTrace();  
              }  
          }  
          if (fos != null) {  
              try {  
                  fos.close();  
              } catch (IOException e1) {  
                  e1.printStackTrace();  
              }  
          }  
          return file;  
      }  
  }  

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

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

//開啟照明  
//本方法需要修改library中的部分代碼,使外面可以獲取到cameraView所引用的Camera,通過gradle引用無法直接使用  
//需要照明的同學,可以下載demo 直接使用library  
public void light(View view) {  
    CameraUtils.flashControl(mCameraView);  
    isLight =!isLight;  
}  
//拍照/錄像  
public void takephoto(View view) {  
    if (isPhoto){  
        mCameraView.captureImage();  
    }else {  
        if (!isVideoStarted) {  
            Toast.makeText(this, "錄像開始", Toast.LENGTH_SHORT).show();  
            mCameraView.startRecordingVideo();  
        }else {  
            mCameraView.stopRecordingVideo();  
        }  
        isVideoStarted =!isVideoStarted;  
    }  
}  
//切換模式  
public void type(View view) {  
    ((ImageView)view).setImageResource(  
            isPhoto ?  
                    R.drawable.icon_photograp_photo :  
                    R.drawable.icon_photograp_video);  
  
        isPhoto =!isPhoto;  
    if (isPhoto){  
        Toast.makeText(this, "已經切換到拍照模式", Toast.LENGTH_SHORT).show();  
    }else Toast.makeText(this, "已經切換到錄像模式", Toast.LENGTH_SHORT).show();  
}  
//前後置切換  
public void font_back(View view) {  
    mCameraView.setFacing(isFont? CameraKit.Constants.FACING_BACK:CameraKit.Constants.FACING_FRONT);  
    isFont=!isFont;  
}  
//拍照的時候開啟閃光燈  
public void flash(View view) {  
    mCameraView.setFlash(isFlash ?CameraKit.Constants.FLASH_OFF:CameraKit.Constants.FLASH_ON);  
    isFlash =!isFlash;  
}  
//縮放  
public void zoom(View view) {  
    mCameraView.setMethod(isStandard ?CameraKit.Constants.METHOD_STILL:CameraKit.Constants.METHOD_STANDARD);  
    isStandard =!isStandard;  
}  

調用照明方法:

public static boolean flashControl(CameraView cameraView) {  
       Camera.Parameters parameters =cameraView.getCamera().getParameters();  
       if (Camera.Parameters.FLASH_MODE_OFF.equals(parameters.getFlashMode())) {  
           parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);  
           cameraView.getCamera().setParameters(parameters);  
           return true;  
       } else if (Camera.Parameters.FLASH_MODE_TORCH.equals(parameters.getFlashMode())) {  
           parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);  
           cameraView.getCamera().setParameters(parameters);  
       }  
       return false;  
   }  

github地址:

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

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *