package com.newingscom.takephoto;
import android.Manifest;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.graphics.Matrix;
import android.hardware.Camera;
import android.os.Build;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class MainActivity extends BaseActivity {
private SurfaceView sv_camera;
private SurfaceHolder surfaceHolder;
private Camera mCamera;
private String TAG = "mingshine";
private boolean isPreviewing;
private Button btn_cancle;
private Button btn_save;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
permission();
initView();
setListener();
}
private void initView() {
setContentView(R.layout.activity_main);
sv_camera = findViewById(R.id.sv_camera);
btn_cancle = findViewById(R.id.btn_cancle);
btn_save = findViewById(R.id.btn_save);
initCamera();
}
private Bitmap takeBitmap = null;
private void initCamera() {
// 获得SurfaceView的SurfaceHolder
surfaceHolder = sv_camera.getHolder();
// 为surfaceHolder添加一个回调监听器
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
startCamera();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// 如果camera不为null ,释放摄像头
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
});
// 设置该SurfaceView自己不维护缓冲
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
private void startCamera() {
//默认开启后置
mCamera = Camera.open(findFrontCamera() == -1 ? 0 : findFrontCamera());
mCamera.setDisplayOrientation(90);//摄像头进行旋转90°
if (mCamera != null) {
try {
Camera.Parameters parameters = mCamera.getParameters();
//设置预览照片的大小
// parameters.setPreviewFpsRange(100, 120);
//设置相机预览照片帧数
// parameters.setPreviewFpsRange(4, 10);
//设置图片格式
parameters.setPictureFormat(ImageFormat.JPEG);
//设置图片的质量
parameters.set("jpeg-quality", 90);
mCamera.setPreviewDisplay(surfaceHolder);
//开始预览
mCamera.startPreview();
isPreviewing = true;
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void setListener() {
sv_camera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isPreviewing && (mCamera != null)) {
mCamera.takePicture(mShutterCallback, null, mJpegPictureCallback);
}
}
});
}
/*为了实现拍照的快门声音及拍照保存照片需要下面三个回调变量*/
Camera.ShutterCallback mShutterCallback = new Camera.ShutterCallback()
//快门按下的回调,在这里我们可以设置类似播放“咔嚓”声之类的操作。默认的就是咔嚓。
{
public void onShutter() {
// TODO Auto-generated method stub
Log.i(TAG, "myShutterCallback:onShutter...");
}
};
Camera.PictureCallback mJpegPictureCallback = new Camera.PictureCallback()
//对jpeg图像数据的回调,最重要的一个回调
{
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub
Log.i(TAG, "myJpegCallback:onPictureTaken...");
takeBitmap = null;
if (null != data) {
takeBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);//data是字节数据,将其解析成位图
mCamera.stopPreview();
isPreviewing = false;
updateBtnVisable(View.VISIBLE);
}
}
};
//取消
public void cancle(View view) {
mCamera.startPreview();
isPreviewing = true;
updateBtnVisable(View.INVISIBLE);
takeBitmap = null;
}
//保存
public void save(View view) {
mCamera.startPreview();
isPreviewing = true;
updateBtnVisable(View.INVISIBLE);
if (takeBitmap != null) {
takeBitmap = adjustPhotoRotation(takeBitmap, -90);
File sdRoot = Environment.getExternalStorageDirectory();
File file = new File(sdRoot, "takephoto");
if (!file.exists()) file.mkdirs();
File bitmapFile = new File(file.getAbsolutePath() + "/" + System.currentTimeMillis() + ".png");
try {
FileOutputStream fos = new FileOutputStream(bitmapFile);
takeBitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
fos.flush();
fos.close();
Toast.makeText(MainActivity.this, "保持成功", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
takeBitmap = null;
}
@Override
protected void onDestroy() {
super.onDestroy();
// 如果camera不为null ,释放摄像头
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
private int findFrontCamera() {
int cameraCount = 0;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras(); // get cameras number
for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
Camera.getCameraInfo(camIdx, cameraInfo); // get camerainfo
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
// 代表摄像头的方位,目前有定义值两个分别为CAMERA_FACING_FRONT前置和CAMERA_FACING_BACK后置
return camIdx;
}
}
return -1;
}
//动态授权
private void permission() {
if (Build.VERSION.SDK_INT >= 23) {
String[] mPermissionList = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA};
ActivityCompat.requestPermissions(MainActivity.this, mPermissionList, 123);
}
}
private void updateBtnVisable(int visable) {
btn_cancle.setVisibility(visable);
btn_save.setVisibility(visable);
}
Bitmap adjustPhotoRotation(Bitmap bm, final int orientationDegree) {
Matrix m = new Matrix();
m.setRotate(orientationDegree, (float) bm.getWidth() / 2, (float) bm.getHeight() / 2);
try {
Bitmap bm1 = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true);
return bm1;
} catch (OutOfMemoryError ex) {
}
return null;
}
}
拍照预览
最新推荐文章于 2023-10-18 10:39:47 发布