2012-11-12 11 views
0

SurfaceView를 사용하여 Camera 객체를 보유하고 있으며 FrameLayout에서보기를 래핑했습니다. 또한 카메라보기를 잡고있는 것과 동일한 활동에 입력 텍스트 상자를 추가했습니다. 클릭하면 소프트 키보드가 열리 며 장치 화면의 절반 (갤럭시 S2)을 덮습니다.이 경우 검은 색이 아닌 화면을 볼 수있었습니다. 소프트 키보드가 열릴 때, 카메라가 작동을 시작하는 이유가 궁금, 나는 소프트 키보드를 닫을 때 검은Android SurfaceView를 사용하면 왜 검은 화면이 나타 납니까?

public class CameraActivity extends Activity { 

private Camera myCamera; 
private MyCameraSurfaceView myCameraSurfaceView; 
private MediaRecorder mediaRecorder; 
private EditText editTextServerIP; 

Button myButton; 
Button btnUpload; 
SurfaceHolder surfaceHolder; 
boolean recording; 
Button btnConnectVideo; 
EditText savePath; 

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

    //policy to prevent exception when stop record 
    //android.os.NetworkOnMainThreadException 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
    ///////////////////////////////////////////////////////////////////////////////////////////// 

    recording = false; 

    setContentView(R.layout.activity_camera); 

    // Get Camera for preview 
    myCamera = getCameraInstance(); 
    if (myCamera == null) { 
     Toast.makeText(CameraActivity.this, "Fail to get Camera", 
       Toast.LENGTH_LONG).show(); 
    } 

    myCameraSurfaceView = new MyCameraSurfaceView(this, myCamera); 
    FrameLayout myCameraPreview = (FrameLayout) findViewById(R.id.videoview); 
    myCameraPreview.addView(myCameraSurfaceView); 

    myButton = (Button) findViewById(R.id.btnRecord); 
    myButton.setOnClickListener(myButtonOnClickListener); 

    btnUpload = (Button) findViewById(R.id.btnUpload); 
    btnUpload.setOnClickListener(btnUploadOnClickListener); 

    editTextServerIP = (EditText) findViewById(R.id.editTextServerIP); 

    btnConnectVideo = (Button) findViewById(R.id.btnConnectVideo); 
    btnConnectVideo.setOnClickListener(askServerToConvertAndConnectAllVideos); 

    savePath = (EditText) findViewById(R.id.editTextPath); 
} 

공용 클래스 MyCameraSurfaceView으로 돌아 간다은 서피스 뷰 SurfaceView는 {

의 SurfaceHolder.Callback을 구현 확장
private SurfaceHolder mHolder; 
    private Camera mCamera; 

    public MyCameraSurfaceView(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 surfaceChanged(SurfaceHolder holder, int format, 
      int weight, int height) { 
     // 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 
     } 

     // make any resize, rotate or reformatting changes here 

     // start preview with new settings 
     try { 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 

     } catch (Exception e) { 
     } 
    } 

답변

0

SurfaceHolder.Callback에서 뭐하고 있니? 소프트 키보드가 열리면 surfaceView의 크기가 조정되어 surfaceChanged 콜백이 트리거됩니다. 샘플 코드 here을 보면 서피스 구성이 변경 될 때 미리보기를 중지하고 새 SurfaceHolder를 사용하여 다시 시작해야합니다. 왜냐하면 시작한 것과 동일한 치수가 아니기 때문입니다.

관련 문제