Camera1使用
- 5.0在配置文件申明一下就好,6.0以上的系统需要考虑动态权限问题
- 现在手机版本基本都在6.0以上,所以需要动态申请权限
<uses-permission android:name="android.permission.CAMERA" />
使用步骤:
调用Camera.open(),打开相机,默认为后置,可以根据摄像头ID来指定打开前置还是后置
调用Camera.getParameters()得到一个Camera.Parameters对象
使用步骤2得到的Camera.Parameters对象,对拍照参数进行设置
调用Camera.setPreviewDispaly(SurfaceHolder holder),指定使用哪个SurfaceView来显示预览图片
调用Camera.startPreview()方法开始预览取景
调用Camera.takePicture()方法进行拍照
拍照结束后,调用Camera.stopPreview()结束取景预览,之后再replease()方法释放资源
XML代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<SurfaceView
android:id="@+id/surface_view_camera2_activity"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ImageView
android:id="@+id/iv_show_camera2_activity"
android:layout_width="180dp"
android:layout_height="320dp"
android:layout_centerInParent="true"
android:scaleType="centerCrop"
android:visibility="gone" />
<Button
android:id="@+id/tvPermissionStatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="确定"
android:textSize="25sp"
android:visibility="gone" />
</RelativeLayout>
Activity代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private final int CAMERA_REQUEST_CODE = 1;
private Button tvPermissionStatus;
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
private Camera camera;
private ImageView iv_show;
private int viewWidth, viewHeight;//mSurfaceView的宽和高
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
requestPermission();
}
//初始化
private void initView() {
tvPermissionStatus = findViewById(R.id.tvPermissionStatus);
iv_show = findViewById(R.id.iv_show_camera2_activity);
mSurfaceView = findViewById(R.id.surface_view_camera2_activity);
mSurfaceHolder = mSurfaceView.getHolder();
//不需要自己的缓冲区
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//添加回调
mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
//初始化Camera
initCamera();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//销毁,释放资源
if (camera != null) {
camera.stopPreview();
camera.release();
}
}
});
//设置点击监听
mSurfaceView.setOnClickListener(this);
tvPermissionStatus.setOnClickListener(this);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (mSurfaceView != null) {
viewWidth = mSurfaceView.getWidth();
viewHeight = mSurfaceView.getHeight();
}
}
/**
* SurfaceHolder 回调接口的方法
*/
private void initCamera() {
//开启
camera = Camera.open();
//设置旋转角度
camera.setDisplayOrientation(90);
if (camera != null) {
try {
Camera.Parameters parameters = camera.getParameters();
//设置预览照片的大小
parameters.setPreviewFpsRange(viewWidth, viewHeight);
//设置相机预览照片帧数
parameters.setPreviewFpsRange(4, 10);
//设置图片格式
parameters.setPictureFormat(ImageFormat.JPEG);
//图片质量
parameters.set("jpeg-quality", 90);
//设置照片的大小
parameters.setPictureSize(viewWidth, viewHeight);
//通过SurfaceView显示预览
camera.setPreviewDisplay(mSurfaceHolder);
//开始预览
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 点击回调方法
*
* @param v
*/
@Override
public void onClick(View v) {
if (camera == null) {
return;
}
camera.autoFocus(autoFocusCallback);
}
/**
* 自动对焦 对焦成功后 就进行拍照
*/
Camera.AutoFocusCallback autoFocusCallback = new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
//成功
camera.takePicture(new Camera.ShutterCallback() { //按下快门
@Override
public void onShutter() {
//按下快门瞬间的操作
}
}, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
}
}, pictureCallback);
}
}
};
Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
final Bitmap resource = BitmapFactory.decodeByteArray(data, 0, data.length);
if (resource == null) {
Toast.makeText(MainActivity.this, "拍照失败", Toast.LENGTH_SHORT).show();
}
//矩阵
final Matrix matrix = new Matrix();
matrix.setRotate(90);
final Bitmap bitmap = Bitmap.createBitmap(resource, 0, 0, resource.getWidth(), resource.getHeight(), matrix, true);
if (bitmap != null && iv_show != null && iv_show.getVisibility() == View.GONE) {
camera.stopPreview();
iv_show.setVisibility(View.VISIBLE);
mSurfaceView.setVisibility(View.GONE);
Toast.makeText(MainActivity.this, "拍照", Toast.LENGTH_SHORT).show();
iv_show.setImageBitmap(bitmap);
}
}
};
private void requestPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// 第一次请求权限时,用户如果拒绝,下一次请求shouldShowRequestPermissionRationale()返回true
// 向用户解释为什么需要这个权限
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
new AlertDialog.Builder(this)
.setMessage("申请相机权限")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//申请相机权限
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
}
})
.show();
} else {
//申请相机权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
}
} else {
tvPermissionStatus.setTextColor(Color.GREEN);
tvPermissionStatus.setText("相机权限已申请");
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == CAMERA_REQUEST_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
tvPermissionStatus.setTextColor(Color.GREEN);
tvPermissionStatus.setText("相机权限已申请");
} else {
//用户勾选了不再询问
//提示用户手动打开权限
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
Toast.makeText(this, "相机权限已被禁止", Toast.LENGTH_SHORT).show();
}
}
}
}
}