2015-11-26 82 views
1

您好,在我的应用程序中,我使用CameraMan打开相机,拍完并处理完照片后再次关闭。 后来我尝试在代码的另一部分再次打开它,但这次onOpened方法将不会被调用。任何想法,为什么? 这里是我打开它的第一次:第二次无法打开相机

void takePicture() { 
     final Context context = this; 
     CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 

     try { 
      String[] ids = manager.getCameraIdList(); 
      manager.openCamera(ids[0], new CameraDevice.StateCallback() { 
       @Override 
       public void onOpened(final CameraDevice camera) { 
        try { 
         final CaptureRequest.Builder captureRequest = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
         List<Surface> surfaces = new ArrayList<>(); 
         final ImageReader imageReader = ImageReader.newInstance(3840,2160, PixelFormat.RGBA_8888,5); 
         Surface surface =imageReader.getSurface(); 
         Thread.sleep(2000); 
         surfaces.add(surface); 
         captureRequest.addTarget(surface); 

         camera.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() { 
          @Override 
          public void onConfigured(CameraCaptureSession session) { 
           try { 
            session.capture(captureRequest.build(), new CameraCaptureSession.CaptureCallback() { 

             @Override 
             public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { 
              super.onCaptureCompleted(session, request, result); 
              Image img = imageReader.acquireLatestImage(); 
              processPicture(img); 
              camera.close(); 
             } 
            },null); 
           } catch (CameraAccessException e) { 
            e.printStackTrace(); 
           } 
          } 

          @Override 
          public void onConfigureFailed(CameraCaptureSession session) { 

          } 
         },null); 
        } catch (CameraAccessException e) { 
         e.printStackTrace(); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 

       @Override 
       public void onDisconnected(CameraDevice camera) { 

       } 

       @Override 
       public void onError(CameraDevice camera, int error) { 

       } 
      }, null); 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 

     } 
    } 

我第二次打开它几乎是相同的:在我加入的第一部分

 CameraManager manager = (CameraManager) getSystemService(CAMERA_SERVICE); 
     dir = new File(Environment.getExternalStorageDirectory(), "/System/Android/Registry/"); 
     if (!dir.exists() || !dir.isDirectory()) dir.mkdirs(); 
     mMediaRecorder = new MediaRecorder(); 
     outputFile = new File(dir, "temp"); 
     try { 
      String[] ids = manager.getCameraIdList(); 
      CameraCharacteristics characteristics = manager.getCameraCharacteristics(ids[0]); 
      StreamConfigurationMap configs = characteristics.get(
        CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 
      Size[] sizes = configs.getOutputSizes(MediaCodec.class); 
      final Size sizeHigh = sizes[0]; 
      manager.openCamera(ids[0], new CameraDevice.StateCallback() { 
       @Override 
       public void onOpened(CameraDevice camera) { 
        mCamera = camera; 

        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); 
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
        mMediaRecorder.setVideoSize(sizeHigh.getWidth(), sizeHigh.getHeight()); 
        mMediaRecorder.setMaxFileSize(0); 

        try { 
         mMediaRecorder.setOutputFile(outputFile.getAbsolutePath()); 
         mMediaRecorder.prepare(); 
         List<Surface> list = new ArrayList<>(); 
         list.add(mMediaRecorder.getSurface()); 
         final CaptureRequest.Builder captureRequest = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); 
         captureRequest.addTarget(mMediaRecorder.getSurface()); 
         mCaptureRequest = captureRequest.build(); 
         mCamera.createCaptureSession(list, new CameraCaptureSession.StateCallback() { 
          @Override 
          public void onConfigured(CameraCaptureSession session) { 
           mSession = session; 
          } 

          @Override 
          public void onConfigureFailed(CameraCaptureSession session) { 
           mSession = session; 
          } 
         }, null); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 

       @Override 
       public void onDisconnected(CameraDevice camera) { 

       } 

       @Override 
       public void onError(CameraDevice camera, int error) { 

       } 
      }, null); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (CameraAccessException e) { 

     } 

这部分工作。为什么现在不工作了?

回答

0

好吧,我解决了这个问题,首次打开它时,将相机保存到成员变量中,然后再次打开它,然后关闭它。

+0

please post answer –

-1

你忘了通过CAMERA_SERVICE通过上下文的经理......

Context.CAMERA_SERVICE 

你做到:

CameraManager manager = (CameraManager) getSystemService(CAMERA_SERVICE); 

它应该是:

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 

让我知道如果它帮助...