2016-01-11 33 views
0

我有什么制作自定义相机看起来充满屏幕的Android

我一有Custom Camera仅使用rear camera hardware没有自拍:)

我的问题

我的相机是不是全屏 & 图片看起来很少放大 .Ca梅拉只需要80%的屏幕

我试过

我用Google搜索和跨充分屏相机的担保人许多代码来了,但在我的情况

我的代码非工程

camera_activity.xml

<FrameLayout 
     android:id="@+id/camera_preview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentTop="true" /> 

CameraActivity.java

private CameraPreview mPreview; 
private FrameLayout cameraPreview; 

cameraPreview = (FrameLayout) findViewById(R.id.camera_preview); 
ViewGroup.LayoutParams layoutParams=new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
mPreview.setLayoutParams(layoutParams); 
cameraPreview.addView(mPreview); 

CameraPreview.java

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    private static final String TAG = "CameraPreview"; 
    private final List<Camera.Size> mSupportedPreviewSizes; 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 
    private Camera.Size mPreviewSize; 

    public CameraPreview(Context context, Camera camera) { 
     super(context); 
     mCamera = camera; 

     mCamera.setDisplayOrientation(90); 
     // supported preview sizes 
     mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes(); 
     for (Camera.Size str : mSupportedPreviewSizes) 
      Log.e(TAG, str.width + "/" + str.height); 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     // deprecated fragment_setting, but required on Android versions prior to 3.0 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     try { 
      // create the surface and start camera preview 
      if (mCamera == null) { 
       //mCamera.setDisplayOrientation(270); 

       Camera.Parameters param = mCamera.getParameters(); 
       param.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
       mCamera.setParameters(param); 
       mCamera.setPreviewDisplay(holder); 
       mCamera.startPreview(); 
      } 
     } catch (IOException e) { 
      Log.d(VIEW_LOG_TAG, "Error fragment_setting camera preview: " + e.getMessage()); 
     } 
    } 

    public void refreshCamera(Camera camera) { 
     if (mHolder.getSurface() == null) { 
      // preview surface does not exist 
      return; 
     } 
     // stop preview before making changes 
     try { 
      mCamera.stopPreview(); 
     } catch (Exception e) { 
      // ignore: tried to stop a non-existent preview 
     } 
     // set preview size and make any resize, rotate or 
     // reformatting changes here 
     // start preview with new fragment_setting 
     setCamera(camera); 
     try { 
      /*mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview();*/ 
      Camera.Parameters parameters = mCamera.getParameters(); 
      parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
      mCamera.setParameters(parameters); 
      mCamera.setDisplayOrientation(90); 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 

     } catch (Exception e) { 
      Log.d(VIEW_LOG_TAG, "Error starting camera preview: " + e.getMessage()); 
     } 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     refreshCamera(mCamera); 
    } 

    public void setCamera(Camera camera) { 
     //method to set a camera instance 
     mCamera = camera; 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     // mCamera.release(); 

    } 

    private 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.height/size.width; 
      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; 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec); 
     final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec); 

     if (mSupportedPreviewSizes != null) { 
      mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height); 
     } 

     float ratio; 
     if (mPreviewSize.height >= mPreviewSize.width) 
      ratio = (float) mPreviewSize.height/(float) mPreviewSize.width; 
     else 
      ratio = (float) mPreviewSize.width/(float) mPreviewSize.height; 

     // One of these methods should be used, second method squishes preview slightly 
     setMeasuredDimension(width, (int) (width * ratio)); 
//  setMeasuredDimension((int) (width * ratio), height); 
    } 

    private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) { 
     Camera.Size result = null; 

     for (Camera.Size size : parameters.getSupportedPreviewSizes()) { 
      if (size.width <= width && size.height <= height) { 
       if (result == null) { 
        result = size; 
       } else { 
        int resultArea = result.width * result.height; 
        int newArea = size.width * size.height; 

        if (newArea > resultArea) { 
         result = size; 
        } 
       } 
      } 
     } 
     return (result); 
    } 
} 

回答

-1

添加getWindow()addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)。 onCreate() -(CameraActivity.java)

public class CameraActivity extends Activity { 
    private static final String TAG = "Camera Activity"; 
    private CameraPreview mPreview; 
    private FrameLayout cameraPreview; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.camera); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     try { 
      cameraPreview = (FrameLayout) findViewById(R.id.camera_preview); 
      ViewGroup.LayoutParams layoutParams=new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
      mPreview.setLayoutParams(layoutParams); 
      cameraPreview.addView(mPreview); 
     } catch (Exception e) { 
      Log.e(TAG, e.getMessage()); 
     } 
    } 
+0

没有任何区别:( –