标签:protected tab mst private bre index character apt suitable
package com.kirin.voltage.activity;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.kirin.voltage.R;
import com.kirin.voltage.util.CompareSizesByArea;
import com.kirin.voltage.util.LogUtil;
import com.kirin.voltage.util.SharedPreferencesUtils;
import com.kirin.voltage.view.AutoFitTextureView;
import android.app.Activity;
import android.content.res.Configuration;
import android.graphics.Matrix;
import android.graphics.RectF;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCaptureSession.StateCallback;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureRequest.Builder;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Range;
import android.util.Size;
import android.util.SparseIntArray;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Surface;
import android.view.TextureView;
import android.view.TextureView.SurfaceTextureListener;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.PopupWindow;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.Toast;
public class RecordActivity extends Activity implements View.OnClickListener {
	private static final int VIDEO_1080 = 0x0;
	private static final int VIDEO_4K = 0x1;
	private static final int VIDEO_NORMAL = 0x2;
	private static final String INDEX = "INDEX";
	private static final String TAG = RecordActivity.class.getSimpleName();
private static final SparseIntArray DEFAULT_ORIENTATION = new SparseIntArray();
	static {
		DEFAULT_ORIENTATION.append(Surface.ROTATION_0, 90);
		DEFAULT_ORIENTATION.append(Surface.ROTATION_90, 0);
		DEFAULT_ORIENTATION.append(Surface.ROTATION_180, 270);
		DEFAULT_ORIENTATION.append(Surface.ROTATION_270, 180);
	}
	private CameraCaptureSession mPreviewSession;
	private CaptureRequest.Builder mPreviewBuilder;
	private CameraConstrainedHighSpeedCaptureSession mPreviewSessionHighSpeed;
private String mFilePath;
	private boolean supportedNormal;
	private boolean supported4K;
	private boolean supported1080P120Fps;
	private boolean isRecording = false;
	private int index;
	private Size size4K, size1080P, size320x240, videoSize, mPreviewSize;;
	private AutoFitTextureView mTextureView;
	private Button btn_record;
	private ImageButton ibtn_info;
private CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {
		@Override
		public void onOpened(CameraDevice camera) {
			mCameraDevice = camera;
			startPreview();
			// mCameraOpenCloseLock.release();
			if (null != mTextureView) {
				configureTransform(mTextureView.getWidth(), mTextureView.getHeight());
			}
		}
		@Override
		public void onError(CameraDevice camera, int error) {
			// mCameraOpenCloseLock.release();
			camera.close();
			mCameraDevice = null;
		}
		@Override
		public void onDisconnected(CameraDevice camera) {
			// mCameraOpenCloseLock.release();
			camera.close();
			mCameraDevice = null;
		}
	};
private TextureView.SurfaceTextureListener textureListener = new SurfaceTextureListener() {
		@Override
		public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
		@Override
		public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
			configureTransform(width, height);
		}
		@Override
		public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
			return true;
		}
		@Override
		public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
			openCamera(width, height);
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_record_video);
		mTextureView = (AutoFitTextureView) findViewById(R.id.textureview);
		btn_record = (Button) findViewById(R.id.btn_record);
		ibtn_info = (ImageButton) findViewById(R.id.ibtn_info);
		btn_record.setOnClickListener(this);
		ibtn_info.setOnClickListener(this);
		index = SharedPreferencesUtils.getInt(this, INDEX, VIDEO_NORMAL);
		size1080P = new Size(1920, 1080);
		size320x240 = new Size(320, 240);
		size4K = new Size(3840, 2160);
		switch (index) {
		case VIDEO_1080:
			videoSize = size1080P;
			break;
		case VIDEO_4K:
			videoSize = size4K;
			break;
		case VIDEO_NORMAL:
			videoSize = size320x240;
			break;
		}
	}
	@Override
	protected void onResume() {
		super.onResume();
		startBackgroundThread();
		if (mTextureView.isAvailable()) {
			openCamera(mTextureView.getWidth(), mTextureView.getHeight());
		} else {
			mTextureView.setSurfaceTextureListener(textureListener);
		}
	}
	private void openCamera(int width, int height) {
		CameraManager manager = (CameraManager) getSystemService(CAMERA_SERVICE);
		try {
			String cameraId = manager.getCameraIdList()[0];
			CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
assert map != null;
availableFpsRange = map.getHighSpeedVideoFpsRangesFor(size1080P);
			Size[] highSpeedVideoSizes = map.getHighSpeedVideoSizes();
			if (highSpeedVideoSizes != null) {
				if (Arrays.asList(highSpeedVideoSizes).contains(size1080P)) {
					Range<Integer>[] ranges = map.getHighSpeedVideoFpsRangesFor(size1080P);
					if (ranges != null) {
						for (Range<Integer> r : ranges) {
							if (r.contains(120)) {
								supported1080P120Fps = true;
								break;
							}
						}
					}
				}
			}
			Size[] outputSizes = map.getOutputSizes(MediaRecorder.class);
			if (outputSizes != null) {
				for (Size s : outputSizes) {
					if (s.equals(size320x240)) {
						supportedNormal = true;
					} else if (s.equals(size4K)) {
						supported4K = true;
					}
				}
			}
mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), width, height, videoSize);
			int orientation = getResources().getConfiguration().orientation;
			if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
				mTextureView.setAspectRatio(mPreviewSize.getWidth(), mPreviewSize.getHeight());
			} else {
				mTextureView.setAspectRatio(mPreviewSize.getHeight(), mPreviewSize.getWidth());
			}
			configureTransform(width, height);
			mMediaRecorder = new MediaRecorder();
			manager.openCamera(cameraId, mStateCallback, null);
} catch (CameraAccessException e) {
			e.printStackTrace();
			LogUtil.e(TAG, "openCamera : " + e);
		}
	}
	private static Size chooseOptimalSize(Size[] choices, int width, int height, Size aspectRatio) {
		List<Size> bigEnough = new ArrayList<Size>();
		int w = aspectRatio.getWidth();
		int h = aspectRatio.getHeight();
		for (Size option : choices) {
			if (option.getHeight() == option.getWidth() * h / w && option.getWidth() <= width
					&& option.getHeight() <= height) {
				bigEnough.add(option);
			}
		}
		if (bigEnough.size() > 0) {
			return Collections.max(bigEnough, new CompareSizesByArea());
		} else {
			LogUtil.e(TAG, "Couldn‘t find any suitable preview size");
			return choices[0];
		}
	}
	protected void onDestroy() {
		if (mCameraDevice != null) {
			mCameraDevice.close();
			mCameraDevice = null;
		}
		if (mMediaRecorder != null) {
			mMediaRecorder.release();
			mMediaRecorder.reset();
			mMediaRecorder = null;
		}
		super.onDestroy();
	};
	private void configureTransform(int width, int height) {
		if (null == mTextureView) {
			return;
		}
		int rotation = getWindowManager().getDefaultDisplay().getRotation();
		Matrix matrix = new Matrix();
		RectF viewRect = new RectF(0, 0, width, height);
		RectF bufferRect = new RectF(0, 0, mPreviewSize.getHeight(), mPreviewSize.getWidth());
		float centerX = viewRect.centerX();
		float centerY = viewRect.centerY();
		if (Surface.ROTATION_90 == rotation || Surface.ROTATION_270 == rotation) {
			bufferRect.offset(centerX - bufferRect.centerX(), centerY - bufferRect.centerY());
			matrix.setRectToRect(viewRect, bufferRect, Matrix.ScaleToFit.FILL);
			float scale = Math.max((float) height / mPreviewSize.getHeight(), (float) height / mPreviewSize.getWidth());
			matrix.postScale(scale, scale, centerX, centerY);
			matrix.postRotate(90 * (rotation - 2), centerX, centerY);
		}
		mTextureView.setTransform(matrix);
	}
	@Override
	protected void onPause() {
		// 处理界面,停止录制
		if (isRecording) {
			stopRecordingVideoOnPause();
		}
		closeCamera();
		stopBackgroundThread();
		super.onPause();
	}
	@Override
	public void onClick(View v) {
		// 处理点击事件
		switch (v.getId()) {
		case R.id.btn_record:
			if (isRecording) {
				stopRecordVideo();
			} else {
				startRecordVideo();
			}
			break;
		case R.id.ibtn_info:
			showChoices();
			break;
		default:
			break;
		}
	}
标签:protected tab mst private bre index character apt suitable
原文地址:https://www.cnblogs.com/android-lol/p/6689232.html