2017-01-11 62 views
0

我寫了一個類相機預覽我怎樣才能顯示我的攝像頭預覽

public class CameraView extends SurfaceView implements SurfaceHolder.Callback{ 
    private Camera camera; 

    public CameraView(Context context) { 
     super(context); 
     getHolder().addCallback(this); 
     getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 


    public static void setCameraDisplayOrientation(Activity activity, int cameraId, Camera camera){ 
     Camera.CameraInfo info = new Camera.CameraInfo(); 
     Camera.getCameraInfo(cameraId, info); 
     int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); 
     int degrees = 0; 
     switch (rotation){ 
      case Surface.ROTATION_0: 
       degrees = 0; 
       break; 
      case Surface.ROTATION_90: 
       degrees = 90; 
       break; 
      case Surface.ROTATION_180: 
       degrees = 180; 
       break; 
      case Surface.ROTATION_270: 
       degrees = 270; 
       break; 
     } 

     int result; 
     if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){ 
      result = (info.orientation + degrees) % 360; 
      result = (360 - result) % 360; 
     }else{ 
      result = (info.orientation - degrees + 360) % 360; 
     } 

     camera.setDisplayOrientation(result); 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder surfaceHolder) { 
     camera = Camera.open(); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { 
     setCameraDisplayOrientation((Activity)getContext(), Camera.CameraInfo.CAMERA_FACING_BACK, camera); 
     Camera.Parameters parameters = camera.getParameters(); 
     Camera.Size bestSize = null; 
     for (Camera.Size size : parameters.getSupportedPictureSizes()){ 
      if (size.width <= i1 && size.height <=i2) { 
       if (bestSize == null) { 
        bestSize = size; 
       } else { 
        int bestArea = bestSize.width * bestSize.height; 
        int newArea = size.width * size.height; 

        if (newArea > bestArea){ 
         bestSize = size; 
        } 
       } 
      } 
     } 

     parameters.setPictureSize(bestSize.width, bestSize.height); 
     parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 
     camera.setParameters(parameters); 

     try{ 
      camera.setPreviewDisplay(surfaceHolder); 
     }catch (IOException e){ 
      e.printStackTrace(); 
     } 

     camera.startPreview(); 


    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
    } 


} 

然後我寫了一個佈局文件,我想在「SurfaceView」顯示預覽

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <SurfaceView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/camera_view" /> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:layout_alignParentBottom="true" 
     android:weightSum="1"> 

     <Button 
      android:id="@+id/stop_navigation" 
      android:layout_weight="0.5" 
      android:layout_height="32dp" 
      android:layout_width="0dp" 
      android:text="@string/stop_navigation" 
      android:textColor="@color/colorWhite" 
      android:textSize="12sp" 
      android:background="@color/colorAccent" /> 
    </LinearLayout> 

</RelativeLayout> 

那麼我應該怎麼做主要活動呢?在我做下面的代碼之前,一切都很好。

CameraView cameraView = new CameraView(this); 
addContentView(cameraView, new ActionBar.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT)); 

但現在我需要將預覽放入我設計的佈局中。

回答

0

試試這個:

您需要更改您的SurfaceView in XML文件。

與此

<CameraView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/camera_view" /> 

更換你surfaceView和你剩下的代碼是Right.let我知道改變後

希望這將有助於...(:

+0

如果我這樣做,我需要更改我的CameraView構造像這樣:public CameraView(上下文上下文,AttributeSet屬性集){super(context,attributeSet); ... }我不確定在主要活動中我應該爲attributeSet傳遞什麼參數。 – OtakuFitness

+0

是的,你是對的..但你必須在你的class中使用一個或多個構造函數。保持原來的構造函數不變,並用attributeSet添加新的構造函數,最後在Main活動中使用舊的構造函數。 –

+0

或者如果您想使用surfaceView使用自定義相機,請點擊此鏈接: - http://www.c-sharpcorner.com/UploadFile/9e8439/how-to-make-a-custom-camera-ion-android/ –

0

首先,你應該添加的攝像頭許可,您Manifest.xml

android:name="android.permission.CAMERA

而且,在您的活動補充一點:

@Override 
protected void onResume() { 
    super.onResume(); 
    mCameraView.start(); 
} 

@Override 
protected void onPause() { 
    mCameraView.stop(); 
    super.onPause(); 
} 

檢查這個環節,這是應該做的最簡單的方法它: https://github.com/google/cameraview

+0

我已經如果我遵循以前的工作,可以顯示相機預覽,但是現在我設計了一個新的佈局,我需要在該佈局中顯示預覽 – OtakuFitness

0
Use FrameLayout and add CameraPreview to it. 



// Create an instance of Camera 
     mCamera = getCameraInstance(); 

     // Create our Preview view and set it as the content of our activity. 
     mPreview = new CameraPreview(this, mCamera); 
     FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
     preview.addView(mPreview); 


/** A basic Camera preview class */ 
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 

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

     // 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); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, now tell the camera where to draw the preview. 
     try { 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
      Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // empty. Take care of releasing the Camera preview in your activity. 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     // If your preview can change or rotate, take care of those events here. 
     // Make sure to stop the preview before resizing or reformatting it. 

     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 settings 
     try { 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 

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


    <FrameLayout 
     android:id="@+id/camera_preview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" 
     />