前言
对于拍照功能来说,Android 由于版本不同可以使用不同的书写方式,光API就有Camera和Camera2两套,其余的区别还有
API Level | Camera API | Preview View |
---|---|---|
9-13 | Camera1 | SurfaceView |
14-20 | Camera1 | TextureView |
21-23 | Camera2 | TextureView |
24及以上 | Camera2 | SurfaceView |
虽然Android能够向下兼容,但是谁不想使用更新的API和技术,另一方面,Camera API调用起来也不方便,所以对Camera调用的封装势在必行。
github上面有一些,但是使用时经常出现兼容性,适配等问题,直到发现了Google自己封装的CameraView,地址:
https://github.com/google/cameraview
导入
这里Google没有上传到仓库,所以我们需要自己导入。
首先去Github页面下载源代码
image.png
把下载的文件里的解压出来,随便放到什么位置
image.png
然后进入Android Studio 选择 Import Module
image.png
选择你刚才解压出来的library(这里我已经改名为cameraView)
image.png
接下来可能会提示错误,需要修改library的build.gradle
image.png
配置文件的sdkversion为你的sdkversion,还有一些test相关的可以删除。
之后再编译一次就可以使用了。
使用
直接上代码,没什么难点。
public class CameraActivity extends SwipeBackActivity {
@BindView(R.id.camera_cameraView)
CameraView cameraView;
@BindView(R.id.camera_flash)
ImageView imageView;
@OnClick({R.id.camera_album,R.id.camera_flash,R.id.camera_paizhao})
void onClick(View view){
switch(view.getId()){
case R.id.camera_album:{
//打开相册选择图片
ImageUtil.openMatisse(this);
break;
}
case R.id.camera_flash:{
int stats = cameraView.getFlash();
if(stats == CameraView.FLASH_TORCH) {//关闭闪光灯
cameraView.setFlash(CameraView.FLASH_OFF);
imageView.setImageResource(R.mipmap.flash);
}
else {//开启闪光灯
cameraView.setFlash(CameraView.FLASH_TORCH);
imageView.setImageResource(R.mipmap.flash_on);
}
break;
}
case R.id.camera_paizhao:{
cameraView.takePicture();//拍照
break;
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BarUtils.setStatusBarAlpha(this);
setContentView(R.layout.activity_camera);
ButterKnife.bind(this);
cameraView.addCallback(new CameraView.Callback() {
@Override
public void onCameraOpened(CameraView cameraView) {
super.onCameraOpened(cameraView);
cameraView.setAspectRatio(AspectRatio.of(1920,1080));//设置图片尺寸
cameraView.setAutoFocus(true);//自动对焦
}
@Override
public void onCameraClosed(CameraView cameraView) {
super.onCameraClosed(cameraView);
}
@Override
public void onPictureTaken(CameraView cameraView, byte[] data) {//在这里保存拍到的图片
super.onPictureTaken(cameraView, data);
String filePath = Util.getWrongFile()+"/"+new Date().getTime()+".jpg";
boolean isSuccess = FileIOUtils.writeFileFromBytesByStream(filePath,data);
if(isSuccess){
setResult(1,new Intent().putExtra("data",filePath));
}else {
setResult(0);
}
finish();
}
});
}
@Override
protected void onResume() {
super.onResume();
cameraView.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
cameraView.stop();
}
@Override
protected void onStop() {
super.onStop();
cameraView.stop();
}
}
网友评论