在AndroidManifest.xml文件中添加以下权限:
在Activity中获取相机对象:
private Camera mCamera;
// ......
@Override
protected void onResume() {
super.onResume();
if (mCamera == null) {
mCamera = Camera.open();
}
}
@Override
protected void onPause() {
super.onPause();
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
在获取相机对象之后,设置相机参数:
private void setCameraParameters(Camera camera) {
Camera.Parameters parameters = camera.getParameters();
// 设置拍照像素为最大值
List pictureSizes = parameters.getSupportedPictureSizes();
Camera.Size pictureSize = pictureSizes.get(0);
for (Camera.Size size : pictureSizes) {
int sizeInPixel = size.width * size.height;
int pictureSizeInPixel = pictureSize.width * pictureSize.height;
if (sizeInPixel > pictureSizeInPixel) {
pictureSize = size;
}
}
parameters.setPictureSize(pictureSize.width, pictureSize.height);
camera.setParameters(parameters);
}
在拍照之前,设置预览画面的显示参数:
private void setPreviewDisplay(Camera camera, SurfaceTexture surfaceTexture) {
try {
camera.setPreviewTexture(surfaceTexture);
} catch (IOException e) {
e.printStackTrace();
}
}
然后,将预览画面显示到TextureView上:
private TextureView mTextureView;
// ......
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
setPreviewDisplay(mCamera, surface);
setCameraParameters(mCamera);
mCamera.startPreview();
}
最后,拍照并保存图片:
private void takePicture(Camera camera) {
camera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
try {
String fileName = Environment.getExternalStorageDirectory().getPath() + "/" + System.currentTimeMillis() + ".jpg";
FileOutputStream out = new FileOutputStream(fileName);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
camera.startPreview();
}
});
}
完整代码如下:
public class MainActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener {
private static final String TAG = "MainActivity";
private Camera mCamera;
private TextureView mTextureView;
// ......
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextureView = findViewById(R.id.textureView);
mTextureView.setSurfaceTextureListener(this);
}
@Override
protected void onResume() {
super.onResume();
if (mCamera == null) {
mCamera = Camera.open();
}
}
@Override
protected void onPause() {
super.onPause();
if (mCamera != null) {
mCamera.release();