2014-08-28 2 views
1

이 프로젝트는 다른 사람의 얼굴에 포인트를보고 비디오를 재생해야합니다. 나는 3 개의 지역으로 스크린을 나누고 지명했다. 프로젝트 카메라를 돌릴 때 갑자기 제 2 영역을 보게되고 제 2 영역에는 아무런 조치가 없기 때문에 오류가 없습니다. 그러나 카메라가 첫 번째 또는 세 번째 영역을 볼 때 - 프로젝트는이 영역에서 비디오 재생을 시작해야합니다 - 갑자기 프로젝트가 닫힙니다.오류 : 뷰 계층 구조를 만든 원래 스레드 만 해당 뷰를 터치 할 수 있습니다.

08-28 11:08:09.392: E/AndroidRuntime(4635): FATAL EXCEPTION: Thread-373 
08-28 11:08:09.392: E/AndroidRuntime(4635): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
08-28 11:08:09.392: E/AndroidRuntime(4635):  at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4078) 
08-28 11:08:09.392: E/AndroidRuntime(4635):  at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:714) 
08-28 11:08:09.392: E/AndroidRuntime(4635):  at android.view.View.requestLayout(View.java:12678) 
08-28 11:08:09.392: E/AndroidRuntime(4635):  at android.view.View.requestLayout(View.java:12678) 
08-28 11:08:09.392: E/AndroidRuntime(4635):  at android.view.View.requestLayout(View.java:12678) 
08-28 11:08:09.392: E/AndroidRuntime(4635):  at android.view.View.requestLayout(View.java:12678) 
08-28 11:08:09.392: E/AndroidRuntime(4635):  at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:268) 
08-28 11:08:09.392: E/AndroidRuntime(4635):  at android.view.View.requestLayout(View.java:12678) 
08-28 11:08:09.392: E/AndroidRuntime(4635):  at android.widget.VideoView.setVideoURI(VideoView.java:213) 
08-28 11:08:09.392: E/AndroidRuntime(4635):  at android.widget.VideoView.setVideoURI(VideoView.java:202) 
08-28 11:08:09.392: E/AndroidRuntime(4635):  at org.opencv.samples.facedetect.FdActivity.startPlaying(FdActivity.java:526) 
08-28 11:08:09.392: E/AndroidRuntime(4635):  at org.opencv.samples.facedetect.FdActivity.onCameraFrame(FdActivity.java:372) 
08-28 11:08:09.392: E/AndroidRuntime(4635):  at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:387) 
08-28 11:08:09.392: E/AndroidRuntime(4635):  at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:321) 
08-28 11:08:09.392: E/AndroidRuntime(4635):  at java.lang.Thread.run(Thread.java:856) 

여기 주요 코드의 필요한 부분이다 :

내 로그 캣 오류입니다.

public void onCreate(Bundle savedInstanceState) { 
    Log.i(TAG, "called onCreate"); 
    super.onCreate(savedInstanceState); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

    setContentView(R.layout.face_detect_surface_view); 

    ..... 

    mMethodSeekbar = (SeekBar) findViewById(R.id.methodSeekBar); 
    mValue = (TextView) findViewById(R.id.method); 

    ..... 
    videoView.setZOrderOnTop(true); 

    // Creating MediaController 
    MediaController mediaController = new MediaController(this); 
    mediaController.setAnchorView(videoView); 
    videoView.setMediaController(mediaController); 

    videoView.setVideoURI(uri2); 
    videoView.requestFocus(); 
    videoView.start(); 


    currentPosition = 0; 


} 

    @Override 
    public void onPause() { 
..... 
    } 
     @Override 
     public void onResume() { 
    .... 
     } 

    @Override 
    public void onDestroy() { 
... 
    } 

@Override 
    public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
     mRgba = inputFrame.rgba(); 
     mGray = inputFrame.gray(); 

     if (mAbsoluteFaceSize == 0) { 
      int height = mGray.rows(); 
      if (Math.round(height * mRelativeFaceSize) > 0) { 
       mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize); 
      } 
     } 

     if (mZoomWindow == null || mZoomWindow2 == null) 
      CreateAuxiliaryMats(); 

     MatOfRect faces = new MatOfRect(); 

      if (mJavaDetector != null) 
       mJavaDetector.detectMultiScale(mGray, faces, 1.1, 2, 
         2, // TODO: objdetect.CV_HAAR_SCALE_IMAGE 
         new Size(mAbsoluteFaceSize, mAbsoluteFaceSize), 
         new Size()); 

     Rect[] facesArray = faces.toArray(); 
     for (int i = 0; i < facesArray.length; i++) { 
      //Core.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(), 
       // FACE_RECT_COLOR, 3); 
      xCenter = (facesArray[i].x + facesArray[i].width + facesArray[i].x)/2; 
      yCenter = (facesArray[i].y + facesArray[i].y + facesArray[i].height)/2; 
      Point center = new Point(xCenter, yCenter); 

      //Core.circle(mRgba, center, 10, new Scalar(255, 0, 0, 255), 3); 

      Log.i("Point Location", Double.toString(xCenter)); 


      if(xCenter>50 && xCenter<250){ 
       Log.i("Point Location","Area 1"); 
       startPlaying(false); 
       } 
      else if (xCenter>250 && xCenter<450) { 
       Log.i("Point Location","Area 2"); 
       /* 
       videoView.stopPlayback(); 
       videoView.setVideoURI(uri2); 
       videoView.requestFocus(); 
       videoView.start(); 
       */ 
      } 
      else if (xCenter>450 && xCenter <650){ 
       Log.i("Point Location","Area 3"); 
       startPlaying(false); 
      } 

      /*Core.putText(mRgba, "[" + center.x + "," + center.y + "]", 
        new Point(center.x + 20, center.y + 20), 
        Core.FONT_HERSHEY_SIMPLEX, 0.7, new Scalar(255, 255, 255, 
          255));  

           //KOORDINATLARI YAZAN FONKSIYON// */ 



      Rect r = facesArray[i]; 
      // compute the eye area 
      Rect eyearea = new Rect(r.x + r.width/8, 
        (int) (r.y + (r.height/4.5)), r.width - 2 * r.width/8, 
        (int) (r.height/3.0)); 
      // split it 
      Rect eyearea_right = new Rect(r.x + r.width/16, 
        (int) (r.y + (r.height/4.5)), 
        (r.width - 2 * r.width/16)/2, (int) (r.height/3.0)); 
      Rect eyearea_left = new Rect(r.x + r.width/16 
        + (r.width - 2 * r.width/16)/2, 
        (int) (r.y + (r.height/4.5)), 
        (r.width - 2 * r.width/16)/2, (int) (r.height/3.0)); 
      // draw the area - mGray is working grayscale mat, if you want to 
      // see area in rgb preview, change mGray to mRgba 
      Core.rectangle(mRgba, eyearea_left.tl(), eyearea_left.br(), 
        new Scalar(255, 0, 0, 255), 2); 
      Core.rectangle(mRgba, eyearea_right.tl(), eyearea_right.br(), 
        new Scalar(255, 0, 0, 255), 2); 

      if (learn_frames < 5) { 
       teplateR = get_template(mJavaDetectorEye, eyearea_right, 24); 
       teplateL = get_template(mJavaDetectorEye, eyearea_left, 24); 
       learn_frames++; 
      } else { 
       // Learning finished, use the new templates for template 
       // matching 
       // match_eye(eyearea_right, teplateR, method); 
       //match_eye(eyearea_left, teplateL, method); 

      } 



     } 

     return mRgba; 
    } 
    ..... 
} 

}

그리고이 생각은 문제가 :

당신이 관련된 모든 방법을 실행 startPlaying() 오류의 근원이라고 생각하면
private void startPlaying(boolean startFromCurrent) { //IHTIYAC 1 

     videoView.stopPlayback(); 
     videoView.setVideoURI(uri1); 
     //videoView.requestFocus(); 

... 
      } 
    }); 

    } 
+0

이 오류는 프로그래밍 방식으로 주 스레드 (UI 스레드라고도 함)와 다른 스레드에서 이벤트를 발생 시키려고 할 때 발생합니다. 당신은'Runnable' 객체로 그러한 호출을 "랩핑"하고 runOnUiThread() 메소드에 의해 메인 쓰레드 큐로 보내야합니다. 예외 추적의 행 번호는 오류의 원인이되는 코드 부분으로 연결됩니다. –

+0

@SashaSalauyou ok 그러나 runOnUiThread() 메소드는 어디에 두어야합니까? 죄송합니다, 안드로이드에서 새로운입니다 – iremcenbertas

+0

'JavaCameraView.java' 클래스의 321 번째 라인을 먼저 살펴보십시오 –

답변

1

내부의 Android 조회수는 runOnUiThread() :

private void startPlaying(boolean startFromCurrent) { 
    runOnUiThread(new Runnable(){ 
     @Override 
     public void run(){ 
      videoView.stopPlayback(); 
      videoView.setVideoURI(uri1); 
     } 
    }); 
... 
+0

그것은 작동합니다! 정말 고맙습니다 :) – iremcenbertas