2016-07-02 1 views
0

비슷한 주제가 연결되어 있지만 광산을 해결할 수 없다는 것을 알고 있습니다. 어쨌든, 나는 일 때한 번만 전체 활동을 호출하는 "플래시"로 일부 전면 카메라를 만들려고합니다.Camera.release가 호출 된 후 카메라가 사용 중입니다. android

@SuppressWarnings("deprecation") 
public class MainActivity extends AppCompatActivity { 
    private Camera mCamera = null; 
    private CameraPreview mCameraView = null; 
    private int cameraId = 0; 

    private void addView() { 
     if (!getPackageManager() 
       .hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 
      Toast.makeText(this, "No camera on this device", Toast.LENGTH_LONG) 
        .show(); 
     } else { 
      cameraId = findFrontFacingCamera(); 
      if (cameraId < 0) { 
       Toast.makeText(this, "No front facing camera found.", 
         Toast.LENGTH_LONG).show(); 
      } else { 
       try { 
        mCamera = Camera.open(cameraId); 
       } catch (Exception e) { 
        Log.d("ERROR", "Failed to get camera: " + e.getMessage()); 
       } 
      } 
     } 
     if (mCamera != null) { 
      mCameraView = new CameraPreview(this, mCamera);//create a SurfaceView to show camera data 
      FrameLayout camera_view = (FrameLayout) findViewById(R.id.camera_view); 
      camera_view.addView(mCameraView);//add the SurfaceView to the layout 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     addView(); 
     ImageButton imgCapture = (ImageButton) findViewById(R.id.imgCapture); 
     imgCapture.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       WindowManager.LayoutParams layout = getWindow().getAttributes(); 
       layout.screenBrightness = 1F; 
       getWindow().setAttributes(layout); 
       setContentView(R.layout.whitescreen); 
       new CountDownTimer(3000, 1000) { 
        public void onTick(long millisUntilFinished) { 
        } 
        public void onFinish() { 
         if (CameraPreview.safeToTakePicture) { 
          CameraPreview.safeToTakePicture = false; 
          mCamera.takePicture(null, null, 
            new PhotoHandler(getApplicationContext())); 
         } 
          setContentView(R.layout.activity_main); 
         addView(); 
        } 
       }.start(); 
      } 
     }); 
    } 

    private int findFrontFacingCamera() { 
     int cameraId = -1; 
     // Search for the front facing camera 
     int numberOfCameras = Camera.getNumberOfCameras(); 
     for (int i = 0; i < numberOfCameras; i++) { 
      Camera.CameraInfo info = new Camera.CameraInfo(); 
      Camera.getCameraInfo(i, info); 
      if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
       Log.d("Camera", "Camera found"); 
       cameraId = i; 
       break; 
      } 
     } 
     return cameraId; 
    } 

} 

나는 비어있는 (흰색 레이아웃)에 레이아웃을 전환 캡처 버튼을 누르면 3 초 사진을 촬영 한 후 여기에, 다시 카메라 뷰를 추가 기다릴 내 CameraPreview 클래스입니다 : 그래서 여기 내 MainActivity입니다 onResume()가 호출 될 때

07-02 14:49:35.561 19017-19017/davidandguy.com.selfielightcamera E/AndroidRuntime: FATAL EXCEPTION: main 
                        Process: davidandguy.com.selfielightcamera, PID: 19017 
                        java.lang.RuntimeException: Camera is being used after Camera.release() was called 
                         at android.hardware.Camera.native_takePicture(Native Method) 
                         at android.hardware.Camera.takePicture(Camera.java:1523) 
                         at android.hardware.Camera.takePicture(Camera.java:1468) 
                         at davidandguy.com.selfielightcamera.MainActivity$1$1.onFinish(MainActivity.java:65) 
                         at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:127) 
                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                         at android.os.Looper.loop(Looper.java:158) 
                         at android.app.ActivityThread.main(ActivityThread.java:7224) 
                         at java.lang.reflect.Method.invoke(Native Method) 
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

심지어 : 사진을 찍을 때

@SuppressWarnings("deprecation") 
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 
    public static boolean safeToTakePicture = false; 

    public CameraPreview(Context context, Camera camera) { 
     super(context); 
     mCamera = camera; 
     mCamera.setDisplayOrientation(90); 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder surfaceHolder) { 
     try { 
      mCamera.setPreviewDisplay(surfaceHolder); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
      Log.d("ERROR", "Camera error on surfaceCreated " + e.getMessage()); 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) { 
     if (mHolder.getSurface() == null) 
      return; 
     try { 
      mCamera.stopPreview(); 
     } catch (Exception e) { 
      Log.d("ERROR", "Trying the camera and it's not running"); 
     } 
     try { 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 
      safeToTakePicture = true; 
     } catch (IOException e) { 
      Log.d("ERROR", "Camera error on surfaceChanged " + e.getMessage()); 
     } 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
     mCamera.stopPreview(); 
     mCamera.release(); 
    } 
} 

나는 예를 들어, 오류 Camera is being used after Camera.release was called에게 시간을 많이 얻을 예를 들어 활동을 최소화 한 다음 다시 실행하십시오. 나는 어딘가에 onPause()onResume()을 넣어야한다는 것을 알고 있지만 어디서/어떻게 구현해야하는지 모르겠습니다. 덕분에

답변

0

이것은 정말로 지연되었습니다.하지만 1 분 전에 비슷한 문제를 해결할 수 있었기 때문에 필자는 필사적으로 스택을 검색 할 수있는 다른 사람과 자신의 이익을 위해 기여할 것이라고 생각했습니다.

의 cameraPreview

public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) { 
try { 
    this.mCamera.setPreviewDisplay(surfaceHolder); 
    this.mCamera.startPreview(); 
} catch (Exception e) { 
} 
} 


public void surfaceCreated(SurfaceHolder surfaceHolder) { 
try { 
    //TODO we need this here too because on SurfaceCreated we always need to open the camera, in case its released 

    this.mCamera.setPreviewDisplay(surfaceHolder); 
    this.mCamera.setDisplayOrientation(90); 
    //this.mCamera.startPreview(); 
} catch (IOException e) { 
} 
} 

다음, CameraActivity

@Override 
public void onResume() { 
    super.onResume(); 
    try{ 
     mCamera = openFrontFacingCameraGingerbread(); 
     // Add to Framelayout 
     this.mCameraPreview = new CameraPreview(this, this.mCamera); 
     mImage.removeAllViews(); 
     this.mImage.addView(this.mCameraPreview); 

    }catch (RuntimeException ex){ 

    } 



} 


@Override 
public void onPause() { 
    super.onPause(); 
    captureButton.setText("Begin Capture"); 
    if(CameraActivity.this.timer !=null) { 
     CameraActivity.this.timer.cancel(); 
     CameraActivity.this.timer.purge(); 
     CameraActivity.this.timer = null; 
    } 
    if (mCamera != null) { 
     mCamera.setPreviewCallback(null); 
     mCameraPreview.getHolder().removeCallback(mCameraPreview); 
     mCamera.release(); 
     mCamera = null; 
    } 


} 


@Override 
protected void onDestroy(){ 
    super.onDestroy(); 
    releaseCameraAndPreview(); 
} 

private void releaseCameraAndPreview() { 

    if (mCamera != null) { 
     mCamera.stopPreview(); 
     mCamera.release(); 
     mCamera = null; 
    } 
    if(mCameraPreview != null){ 
     mCameraPreview.destroyDrawingCache(); 
     mCameraPreview.mCamera = null; 
    } 
} 
를 내가 여기 당신의 라이프 사이클 코드를 볼 수 없습니다,하지만 나를 위해 일을 heres 무엇 surfaceDestroyed가

먼저 내 경우에는 비어

관련 문제