2015-05-20 15 views
6

Dưới đây là đoạn mã của tôi, nơi tôi muốn chơi một đoạn video đến từ máy chủvideoView.setOnPreparedListener, videoView.setOnCompletionListener và videoView.setOnErrorListener không nhận được gọi

private void PlayVideo() { 
    try { 
     getWindow().setFormat(PixelFormat.TRANSLUCENT); 
     MediaController mediaController = new MediaController(VideoActivity.this); 
     mediaController.setAnchorView(videoView); 
     Uri video = Uri.parse(videoPath); 
     videoView.setMediaController(mediaController); 
     videoView.setVideoURI(video); 
     videoView.requestFocus(); 

     videoPlayer.removeAllViews(); 
     videoPlayer.setVisibility(View.GONE); 
     videoView.setVisibility(View.VISIBLE); 
     videoView.setOnPreparedListener(new OnPreparedListener() { 

      @Override 
      public void onPrepared(MediaPlayer mp) { 
       dismissProgressDialog(); 
       videoView.bringToFront(); 
       videoView.setFocusable(true); 
       videoView.start(); 
       contentStarted = true; 
      } 
     }); 
     videoView.setOnCompletionListener(new OnCompletionListener() { 

      @Override 
      public void onCompletion(MediaPlayer mp) { 
       contentStarted = false; 
      } 
     }); 
     videoView.setOnErrorListener(new OnErrorListener() { 

      @Override 
      public boolean onError(MediaPlayer mp, int what, int extra) { 
       dismissProgressDialog(); 
       Intent in = new Intent(); 
       setResult(1, in); 
       finish(); 
       return false; 
      } 

     }); 

    } catch (Exception e) { 
     dismissProgressDialog(); 
     finish(); 
    } 
} 

Các ProgressDialog được sa thải chỉ trong videoView.setOnPreparedListenervideoView.setOnErrorListener. Nhưng ProgressDialog không bị loại bỏ và video không được phát. Tôi đã thử đặt Nhật ký và xem, Nhật ký được in tối đa ngay trước videoView.setOnPreparedListener và sau đó không có Nhật ký nào được hiển thị. Listeners không được đăng ký tôi đoán.

Mọi trợ giúp đều được đánh giá cao. Cảm ơn trước.

EDIT:

'm cố gắng để dòng một video trực tiếp, nếu video là availbale nó nên đến videoView.setOnPreparedListener và nên chơi video. Nếu Live là không có sẵn (ví dụ, Video sẽ xuất hiện sau một thời gian) sau đó nó nên đến videoView.setOnErrorListener và trở về trước Activity với kết quả "1"

Video được xem trực tiếp trên RTSP

+0

videoPlayer.removeAllViews(); để làm gì ? –

+0

Tôi có một trình phát video thay thế (dành cho quảng cáo) mà tôi sẽ xóa để chỉ videoView để phát video trực tiếp có mặt –

+0

Tôi nghĩ bạn nên gọi videoView.prepare(); –

Trả lời

3

Sau rất nhiều nghiên cứu và với sự giúp đỡ của Preethi Rao, tôi đã biết rằng lỗi đã xảy ra ở số URL.

URL có thể có video (nếu đó là thời gian cho Video trực tiếp) và có thể không có video (nếu video trực tiếp sẽ phát trực tuyến sau một thời gian). Nếu tôi đang cố phát trực tuyến video khi không có Video trực tiếp thì Listeners sẽ không bị phát. Nếu Video trực tiếp là availbale, Listeners sẽ bị kích hoạt. Vì vậy, videoView.setOnPreparedListenervideoView.setOnErrorListener không được đính kèm.

Tôi đã viết một trình xử lý để chạy trong 60 giây và nếu không có Listeners được đính kèm, tôi chỉ quay lại trước Activity.

Dưới đây là các mã:

private void PlayVideo() { 
    try { 
     isListenerAttached = false; 
     getWindow().setFormat(PixelFormat.TRANSLUCENT); 
     MediaController mediaController = new MediaController(VideoActivity.this); 
     mediaController.setAnchorView(videoView); 
     Uri video = Uri.parse(videoPath); 
     videoView.setMediaController(mediaController); 
     videoView.setVideoURI(video); 
     videoView.requestFocus(); 

     videoPlayer.removeAllViews(); 
     videoPlayer.setVisibility(View.GONE); 
     videoView.setVisibility(View.VISIBLE); 

     // Using this Handler to revert to previous Activity when the Video View is not attached to Listeners 
     // As the Buffering Video dialog doesn't get dismissed if Video View is not attached to Listeners 
     runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       new Handler().postDelayed(new Runnable(){ 

        @Override 
        public void run() { 
         if(!isListenerAttached){ 
          dismissProgressDialog(); 
          Intent in = new Intent(); 
          setResult(1, in); 
          finish(); 
         } 
        } 
       }, WAIT_TIME); 
      } 
     }); 

     videoView.setOnPreparedListener(new OnPreparedListener() { 

      @Override 
      public void onPrepared(MediaPlayer mp) { 
       isListenerAttached = true; 
       dismissProgressDialog(); 
       videoView.bringToFront(); 
       videoView.setFocusable(true); 
       videoView.start(); 
       contentStarted = true; 
      } 
     }); 
     videoView.setOnCompletionListener(new OnCompletionListener() { 

      @Override 
      public void onCompletion(MediaPlayer mp) { 
       contentStarted = false; 
      } 
     }); 
     videoView.setOnErrorListener(new OnErrorListener() { 

      @Override 
      public boolean onError(MediaPlayer mp, int what, int extra) { 
       isListenerAttached = true; 
       dismissProgressDialog(); 
       Intent in = new Intent(); 
       setResult(1, in); 
       finish(); 
       return false; 
      } 

     }); 

    } catch (Exception e) { 
     dismissProgressDialog(); 
     finish(); 
    } 
} 
Các vấn đề liên quan