2017-06-17 85 views
0

因此,我在视图内显示前后相机预览,并且想要切换预览(从前到后再每2秒后再前一次)以及任何我可能尝试,我失败了。这里是我尝试切换视图的代码(是它甚至在正确的地方,使相机的开关):在固定时间之后在前后相机预览之间切换

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // The Surface has been created, now tell the camera where to draw the preview. 
    try { 
     // infinite for loop - doesn't work 
     if(camIter == 1){ 
      cleanup(); 
      initCamera(getContext()); 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 
      camIter = 2; 
      // Thread.sleep(2000); - Doesn't work! 
     } 
     if(camIter == 2){ 
      cleanup(); 
      initCamera(getContext()); 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 
      camIter = 1; 
      // Thread.sleep(2000); - Doesn't work! 
     }     

    } catch (IOException e) { 
     Log.d(TAG, "CameraExample: " + "Error setting camera preview: " + e.getMessage()); 
    } 
} 

这里是在我试图做满级它(使用开关更改相机预览):

public class CameraExample extends AnimatedViewContainer { 

    private final static String TAG = "CameraExample"; 

    private Camera mCamera; 
    private CameraPreview frontPreview, backPreview; 
    private Context mContext; 
    public int camIter = 1; 

    public CameraExample(Context context, int i) { 
     super(context, i); 

     frontPreview = null; 
     backPreview = null; 
     mContext = context; 

     initCamera(context); 
    } 

    private void initCamera(Context context) { 

     // Check if this device has a camera 
     if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 

      // No camera on this device 
      Log.d("Camera", "CameraExample: " + "this device has no camera"); 
     } else { 

      // This device has a camera 
      int numCameras = Camera.getNumberOfCameras(); 
      if (numCameras >= 1) { 

       switch (camIter) { 
        case 1: 
         for (int cameraId = 1; cameraId < numCameras; cameraId++) { 

          mCamera = getCameraInstance(cameraId); 
          if (mCamera != null) { 
           CameraInfo cameraInfo = new CameraInfo(); 
           Camera.getCameraInfo(cameraId, cameraInfo); 
           if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
            try { 

             //Create our Preview view and set it as the content of this LinearLayout View 
             frontPreview = new CameraPreview(context, mCamera, cameraId); 
            } catch (RuntimeException e) { 
             Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage()); 
            } 
           } 
           if (createView() == false) { 
            break; 
           } 
          } 
         } 
         break; 
        case 2: 
         for (int cameraId = 0; cameraId < 1; cameraId++) { 
          mCamera = getCameraInstance(cameraId); 
          if (mCamera != null) { 
           CameraInfo cameraInfo = new CameraInfo(); 
           Camera.getCameraInfo(cameraId, cameraInfo); 
           if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) { 
            try { 

             //Create our Preview view and set it as the content of this LinearLayout View 
             backPreview = new CameraPreview(context, mCamera, cameraId); 
            } catch (RuntimeException e) { 
             Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage()); 
            } 
           } 
           if (createView() == false) { 
            break; 
           } 
          } 
         } 
         break; 
       } 
      } 
     } 
    } 

    public static Camera getCameraInstance(int cameraId) { 
     Camera c = null; 
     try { 
      // attempt to get a Camera instance 
      c = Camera.open(cameraId); 
     } catch (Exception e) { 
      // Camera is not available (in use or does not exist) 
      Log.d(TAG, "CameraExample: " + "camera not available (in use or does not exist); " + e.getMessage()); 
     } 

     // returns null if camera is unavailable 
     return c; 
    } 

    @Override 
    public void onCreateViewContent(LayoutInflater layoutInflater, ViewGroup parentGroup, View[] containerViews, int index) { 
     containerViews[index] = layoutInflater.inflate(R.layout.example_camera, parentGroup, false); 
     FrameLayout previewFrame = (FrameLayout) containerViews[index].findViewById(R.id.preview); 


      // set camera preview 
      if (camIter == 1) { 
       previewFrame.addView(frontPreview); 
      } 
      if (camIter == 2) { 
       previewFrame.addView(backPreview); 
      } 

    } 

    @Override 
    public void cleanup() { 
     if (mCamera != null) { 
      mCamera.stopPreview(); 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 

    // A basic Camera preview class 
    public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 

     private static final String TAG = "CameraPreview"; 

     private Context mContext; 
     private SurfaceHolder mHolder; 
     private Camera mCamera; 
     private int mCameraId; 

     public CameraPreview(Context context, Camera camera, int cameraId) { 
      super(context); 
      mContext = context; 
      mCamera = camera; 
      mCameraId = cameraId; 

      // Install a SurfaceHolder.Callback so we get notified when the 
      // underlying surface is created and destroyed. 
      mHolder = getHolder(); 
      mHolder.addCallback(this); 
     } 

     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 
      // The Surface has been created, now tell the camera where to draw the preview. 
      try { 

       // infinite for loop - doesn't work 
       if(camIter == 1){ 
        cleanup(); 
        initCamera(getContext()); 
        mCamera.setPreviewDisplay(holder); 
        mCamera.startPreview(); 
        camIter = 2; 
        // Thread.sleep(2000); - Doesn't work! 
       } 
       if(camIter == 2){ 
        cleanup(); 
        initCamera(getContext()); 
        mCamera.setPreviewDisplay(holder); 
        mCamera.startPreview(); 
        camIter = 1; 
        // Thread.sleep(2000); - Doesn't work! 
       } 

      } catch (IOException e) { 
       Log.d(TAG, "CameraExample: " + "Error setting camera preview: " + e.getMessage()); 
      } 
     } 

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

这怎么办?谢谢!

+0

从cleanup()中删除mCamera.stopPreview()。 –

+0

对于每2秒钟你可以使用CountDownTimer它是简单快捷的解决方案 –

+0

@AndyDeveloper你可以展示一个样本!这一直在困扰着我很多年! –

回答

0
Handler h = new Handler(); 
int delay =2000; //milliseconds 

//action will perform every two seconds 
h.postDelayed(new Runnable(){ 
    public void run(){ 
     switchCamera(); 
     h.postDelayed(this, delay); 
    } 
}, delay); 

private void switchCamera() { 
     cleanup(); 
     initCamera(getContext()); 
     mCamera.setPreviewDisplay(holder); 
     mCamera.startPreview(); 
     camIter = camIter == 1 ? 2 : 1; 
} 
+0

'Camera.release()被调用错误后正在使用相机 –