package com.afei.camerademo.textureview; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.media.Image; import android.media.ImageReader; import android.os.AsyncTask; import android.os.Bundle; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.ImageView; import com.afei.camerademo.ImageUtils; import com.afei.camerademo.R; import com.afei.camerademo.camera.Camera2Proxy; import java.nio.ByteBuffer; public class TextureCamera2Activity extends AppCompatActivity implements View.OnClickListener { private static final String TAG = "TextureCameraActivity"; private ImageView mCloseIv; private ImageView mSwitchCameraIv; private ImageView mTakePictureIv; private ImageView mPictureIv; private Camera2TextureView mCameraView; private Camera2Proxy mCameraProxy; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_texture_camera2); initView(); } private void initView() { mCloseIv = findViewById(R.id.toolbar_close_iv); mCloseIv.setOnClickListener(this); mSwitchCameraIv = findViewById(R.id.toolbar_switch_iv); mSwitchCameraIv.setOnClickListener(this); mTakePictureIv = findViewById(R.id.take_picture_iv); mTakePictureIv.setOnClickListener(this); mPictureIv = findViewById(R.id.picture_iv); mPictureIv.setOnClickListener(this); mPictureIv.setImageBitmap(ImageUtils.getLatestThumbBitmap()); mCameraView = findViewById(R.id.camera_view); mCameraProxy = mCameraView.getCameraProxy(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.toolbar_close_iv: finish(); break; case R.id.toolbar_switch_iv: mCameraProxy.switchCamera(mCameraView.getWidth(), mCameraView.getHeight()); mCameraProxy.startPreview(); break; case R.id.take_picture_iv: mCameraProxy.setImageAvailableListener(mOnImageAvailableListener); mCameraProxy.captureStillPicture(); // 拍照 break; case R.id.picture_iv: Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivity(intent); break; } } private ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener () { @Override public void onImageAvailable(ImageReader reader) { new ImageSaveTask().execute(reader.acquireNextImage()); // 保存图片 } }; private class ImageSaveTask extends AsyncTask<Image, Void, Bitmap> { @Override protected Bitmap doInBackground(Image ... images) { ByteBuffer buffer = images[0].getPlanes()[0].getBuffer(); byte[] bytes = new byte[buffer.remaining()]; buffer.get(bytes); long time = System.currentTimeMillis(); if (mCameraProxy.isFrontCamera()) { Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); Log.d(TAG, "BitmapFactory.decodeByteArray time: " + (System.currentTimeMillis() - time)); time = System.currentTimeMillis(); // 前置摄像头需要左右镜像 Bitmap rotateBitmap = ImageUtils.rotateBitmap(bitmap, 0, true, true); Log.d(TAG, "rotateBitmap time: " + (System.currentTimeMillis() - time)); time = System.currentTimeMillis(); ImageUtils.saveBitmap(rotateBitmap); Log.d(TAG, "saveBitmap time: " + (System.currentTimeMillis() - time)); rotateBitmap.recycle(); } else { ImageUtils.saveImage(bytes); Log.d(TAG, "saveBitmap time: " + (System.currentTimeMillis() - time)); } images[0].close(); return ImageUtils.getLatestThumbBitmap(); } @Override protected void onPostExecute(Bitmap bitmap) { mPictureIv.setImageBitmap(bitmap); } } }