你好,我是这种
Android Studio Error的新手.可能只是一个警告,但我一直面临着找不到课程的问题.
实际上我正在开发Android Camera API应用程序,问题是我的Front Facing Camera Preview是Stretch.它只发生在华为p8 lite等2-3个设备上.当切换到前置摄像头时,设备会拉伸摄像头预览!
我有相机预览类:
- public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
- //Variables de' Preview
- private SurfaceHolder mHolder;
- private List<Camera.Size> mSupportedPreviewSizes;
- private Camera.Size mPreviewSize;
- private int FOCUS_AREA_SIZE=300;
- public static Camera previewCamera;
- ////////////////////////
- //protected LOGGER keys
- protected final String EXCEPTION_KEY="xception";
- //////////////////////////
- public CameraPreview(Context context,Camera camera) {
- super(context);
- //get the camera
- previewCamera = camera;
- if(previewCamera!=null){
- // supported preview sizes
- mSupportedPreviewSizes = previewCamera.getParameters().getSupportedPreviewSizes();
- }
- else{
- previewCamera=camera;
- // supported preview sizes
- mSupportedPreviewSizes = previewCamera.getParameters().getSupportedPreviewSizes();
- }
- // Install a SurfaceHolder.Callback so we get notified when the
- // underlying surface is created and destroyed.
- mHolder = getHolder();
- mHolder.addCallback(this);
- // deprecated setting,but required on Android versions prior to 3.0
- mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- setKeepScreenOn(true);
- setPreview();
- }
- @Override
- public void surfaceCreated(SurfaceHolder surfaceHolder) {
- try{
- //when the surface is created,we can set the camera to draw images in this surfaceholder
- setPreview();
- previewCamera.setPreviewDisplay(surfaceHolder);
- previewCamera.startPreview();
- if(CameraActivity.cameraId==1){
- previewCamera.setFaceDetectionListener(faceDetectionListener);
- previewCamera.startFaceDetection();
- }
- } catch(Exception exp){
- Log.i(EXCEPTION_KEY,"FROM surfaceCreated: "+exp.toString());
- }
- }
- @Override
- public void surfaceChanged(SurfaceHolder surfaceHolder,int i,int i2,int i3) {
- //before changing the application orientation,you need to stop the preview,rotate and then start it again
- if(mHolder.getSurface() == null)//check if the surface is ready to receive camera data
- return;
- try{
- previewCamera.stopPreview();
- } catch (Exception e){
- //this will happen when you are trying the camera if it's not running
- }
- //now,recreate the camera preview
- try{
- //set the camera preview on every preview change
- setPreview();
- //in case the preview is still stretched bingo! Then...
- // Camera.Parameters params = previewCamera.getParameters();
- // List<Camera.Size> sizes = params.getSupportedPreviewSizes();
- // Camera.Size optimalSize = PreviewSizeParameters.getOptimalPreviewSize(sizes,i2,i3);
- // params.setPreviewSize(optimalSize.width,optimalSize.height);
- // previewCamera.setParameters(params);
- previewCamera.setPreviewDisplay(mHolder);
- previewCamera.startPreview();
- if(CameraActivity.cameraId==1){
- previewCamera.setFaceDetectionListener(faceDetectionListener);
- previewCamera.startFaceDetection();
- }
- } catch(Exception exp){
- Log.i(EXCEPTION_KEY,"FROM surfaceChanged: "+exp.toString());
- }
- }
- public void setPreview(){
- try{
- //set the focusable true
- this.setFocusable(true);
- //set the touch able true
- this.setFocusableInTouchMode(true);
- //set the camera display orientation lock
- previewCamera.setDisplayOrientation(90);
- //get the camera parameters
- Camera.Parameters parameters = previewCamera.getParameters();
- //set the preview size
- parameters.setPreviewSize(mPreviewSize.width,mPreviewSize.height);
- //set the parameter
- previewCamera.setParameters(parameters);
- }catch(Exception exp){
- Log.i(EXCEPTION_KEY,"FROM setPreview: "+exp.toString());
- }
- }
- @Override
- public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
- //our app has only one screen,so we'll destroy the camera in the surface
- //if you are using with more screens,please move this code your activity
- try{
- //handle in Activity onResume and onPause
- }catch(Exception exp){
- Log.i(EXCEPTION_KEY,"FROM surfaceDestroyed: "+exp.toString());
- }
- }
- //Override Methods here
- @Override
- protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {
- try{
- final int width = resolveSize(getSuggestedMinimumWidth(),widthMeasureSpec);
- final int height = resolveSize(getSuggestedMinimumHeight(),heightMeasureSpec);
- setMeasuredDimension(width,height);
- if (mSupportedPreviewSizes != null) {
- mPreviewSize = PreviewSizeParameters.getOptimalPreviewSize(mSupportedPreviewSizes,width,height);
- }
- }catch(Exception exp){
- Log.i(EXCEPTION_KEY,"FROM onMeasure: "+exp.toString());
- }
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
- private void stopPreviewAndFreeCamera() {
- if (previewCamera != null) {
- // Call stopPreview() to stop updating the preview surface.
- previewCamera.stopPreview();
- // Important: Call release() to release the camera for use by other
- // applications. Applications should release the camera immediately
- // during onPause() and re-open() it during onResume()).
- previewCamera.release();
- previewCamera = null;
- }
- }
- //end of outer class here
- }
自从过去几天以来,我一直在解决这个问题,并在我的自定义相机预览中获得相同的拉伸效果.
所以我获得最佳预览尺寸的方法是:
- public class PreviewSizeParameters {
- //protected LOGGER keys
- protected static final String EXCEPTION_KEY = "xception";
- //////////////////////////
- public static Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes,int w,int h) {
- final double ASPECT_TOLERANCE = 0.1;
- double targetRatio = (double) h / w;
- if (sizes == null) return null;
- Camera.Size optimalSize = null;
- double minDiff = Double.MAX_VALUE;
- int targetHeight = h;
- for (Camera.Size size : sizes) {
- double ratio = (double) size.width / size.height;
- if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
- if (Math.abs(size.height - targetHeight) < minDiff) {
- optimalSize = size;
- minDiff = Math.abs(size.height - targetHeight);
- }
- }
- if (optimalSize == null) {
- minDiff = Double.MAX_VALUE;
- for (Camera.Size size : sizes) {
- if (Math.abs(size.height - targetHeight) < minDiff) {
- optimalSize = size;
- minDiff = Math.abs(size.height - targetHeight);
- }
- }
- }
- return optimalSize;
- }
- }
问题
问题是只在前置摄像头上拉伸摄像头预览.我的日志cat数据如下:
它显示了一些行开头:I / art:找不到类:因为我是新手,所以我不知道它们是什么意思?