2011-05-04 6 views
0

Android 카메라 API를 사용하려고합니다. 동영상 미리보기가 효과적입니다. 사진을 찍은 다음 SDCARD에 저장하는 데 사용되는 버튼 인스턴스가 있습니다. 때로는 완벽하게 작동하지 않는 경우도 있습니다. 버튼을 누르기 만하면 비디오 미리보기가 멈추고 아무 반응이 없으며 "응용 프로그램이 응답하지 않습니다."등과 같은 팝업이 표시됩니다. 이 사건이 일어날 때 (3 번에 약 1 번) 나는 logcat에 오류 메시지가 없다. 그 후 카메라를 더 이상 사용할 수 없기 때문에 전화기를 재부팅해야합니다.Android에서 카메라 API를 사용할 때 문제가 발생했습니다.

05-03 18:22:31.053: INFO/SecCamera(76): int android::SecCamera::endSnapshot() : 
05-03 18:22:31.053: INFO/SecCamera(76): munmap():virt. addr 0x41ddb000 size = 4261248 
05-03 18:22:31.061: DEBUG/dalvikvm(700): GC_FOR_MALLOC freed 506K, 57% free 2779K/6407K, external 1625K/2137K, paused 15ms 
05-03 18:22:31.061: INFO/dalvikvm-heap(700): Grow heap (frag case) to 7.734MB for 1114262-byte allocation 
05-03 18:22:31.088: DEBUG/dalvikvm(700): GC_FOR_MALLOC freed 0K, 49% free 3867K/7559K, external 1625K/2137K, paused 13ms 
05-03 18:22:31.127: DEBUG/dalvikvm(700): GC_CONCURRENT freed <1K, 49% free 3867K/7559K, external 1625K/2137K, paused 2ms+2ms 
05-03 18:22:32.022: ERROR/CameraDemo(700): onPictureTaken - wrote bytes: 1114246 
05-03 18:22:32.022: ERROR/CameraDemo(700): onPictureTaken - jpeg 

나는를 저장하는 응용 프로그램에 대해 시간을두고 타이머를 추가하려고 :

public class Test_cam extends Activity implements PictureCallback,ShutterCallback,OnClickListener{ 
    private static final String TAG = "CameraDemo"; 
     Test_cam_preview preview; // This object will create the Camera object and return it to the CameraDemo activity. 
     Button buttonClick; 
     public boolean onProgress = false; 

     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.camera); 

     preview = new Test_cam_preview(this); 
     ((FrameLayout) findViewById(R.id.preview)).addView(preview); 

     buttonClick = (Button) findViewById(R.id.buttonClick); 
     buttonClick.setOnClickListener(this);  
     Log.d(TAG, "onCreate'd"); 
     } 

     public void launch_scanpic(){ 
       Intent intent = new Intent(Test_cam.this,Test_cam_scanpic.class); 
       startActivity(intent); 
     } 



      @Override 
      public void onClick(View v) { 
        if(!onProgress) 
        { 
          onProgress = true; 
        preview.camera.takePicture(Test_cam.this, null, Test_cam.this); //bien mettre null car raw callback renvoit tjrs null! 
        //on lance scanclothe activity 
        } 
    } 


     @Override 
    public void onShutter() { 
      Log.d(getClass().getSimpleName(), "get pic...");    
    } 



     @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 

      FileOutputStream outStream = null; 
      try { 
      if (data==null) 
      { 
        Log.e(TAG,"data is null !!!!!!!"); 
      } 
      else 
      { 
        // Write to SD Card 
        outStream = new FileOutputStream("/sdcard/test.jpg"); 
        outStream.write(data); 
        Log.e(TAG, "onPictureTaken - wrote bytes: " + data.length); 
        outStream.close(); 
      } 



      } catch (FileNotFoundException e) { 
       Log.e(getClass().getSimpleName(), "file not found",e); 
      e.printStackTrace(); 
      } catch (IOException e) { 
       Log.e(getClass().getSimpleName(), "Saving picture error",e); 
      e.printStackTrace(); 
      } 

      Log.e(TAG, "onPictureTaken - jpeg"); 
      SystemClock.sleep(2000); 
      onProgress=false; 
      launch_scanpic(); 
     } 

}

응용 프로그램이 작동

, 내가 분명히 올바른 로그 캣을 얻을 : 여기 내 코드입니다 그림, 그러나 효과 없음. Google Nexus S (2.3.4)에서 테스트 중입니다. 누구든지이 문제를 해결하는 데 도움이 될 수 있습니까? 사전에

class Test_cam_preview extends SurfaceView implements SurfaceHolder.Callback{ 
    private static final String TAG = "Preview"; 
    SurfaceHolder mHolder; 
    public Camera camera; 

    Test_cam_preview(Context context){ 
    super(context); 
    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);} 

    public void surfaceCreated(SurfaceHolder holder){ 
    camera = Camera.open(); 
    Camera.Parameters params = camera.getParameters(); 
    params.setPictureFormat(PixelFormat.JPEG); 
    params.set("flash-mode", "auto"); 
    camera.setParameters(params);  
    try { 
     camera.setPreviewDisplay(holder); 

     camera.setPreviewCallback(new PreviewCallback(){ 
     public void onPreviewFrame(byte[] data, Camera camera){ 
      Test_cam_preview.this.invalidate(); 
     } 
     }); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     camera.release(); 
     camera = null; 
    }} 
    public void surfaceDestroyed(SurfaceHolder holder){ 
     if(camera != null){ 
      camera.stopPreview(); 
      camera.setPreviewCallback(null); 
      camera.release(); //it is important that this is done so camera is  
      camera = null; 
     } 
    } 
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    camera.startPreview(); 
    }} 

감사 : 여기

내 코드의 미리보기 부분입니다.

+0

에 제외 미세 매번 일 때문에 넥서스 S 카메라 네이티브 코드에서 버그가 수 있어야합니다 가정 . – john7002

답변

0

나는 거의 같은 경우입니다.

사진을 찍는 JNI 스레드가 아직 완료되지 않았으며 libcamera/SecCameraHWInterface.cpp의 mCaptureInProgress 변수가 아직 false로 설정되어 있지 않으므로 onPictureTaken에서 충돌이 발생합니다.

문제를 해결하려면 "SystemClock.sleep (2000);"을 제거해야합니다. 대신 takePicture 스레드가 종료 된 후 의도를 시작하는 다른 스레드에 지연된 메시지를 보냅니다.

은 내가 여러 안드로이드 폰에 내 응용 프로그램을 시도하고 그것은 또한 동일한 주파수와 에뮬레이터에 somtimes 정지 넥서스 S :(

관련 문제