Tôi có một ứng dụng với VideoView sẽ tiếp tục lặp lại cùng một video cho đến khi người dùng thực hiện điều gì đó với thiết bị (màn hình cảm ứng, v.v.) Hiện tại tôi đang sử dụng OnCompletionListener() để khởi động lại video một khi nó kết thúc. Điều này hoạt động đúng trên mọi thiết bị tôi đã thử nghiệm, ngoại trừ Samsung Replenish.VideoView looping video Replenish
Đây là mã của tôi:
mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mVideoView.setVideoPath(file.getAbsolutePath());
mVideoView.start();
}
});
gì xảy ra trên Replenish là video chơi tất cả các cách thức thông qua một lần nhưng sau đó không bao giờ bắt đầu một lần nữa và màn hình đi tất cả màu đen (Nhưng đèn nền vẫn bật). Trên mọi thiết bị khác tôi đã thử nghiệm cùng với mã chính xác này, nó đã làm việc để lặp lại video. Có ai biết về bất cứ điều gì cụ thể về các Replenish có thể gây ra lỗi này? Tôi nghĩ có thể trì hoãn các cuộc gọi đến setVideoPath(), và bắt đầu() bằng 200-300ms có thể giúp nó, nhưng điều đó không ảnh hưởng gì. Tôi thực sự thua lỗ ở đây.
tôi nhìn thấy những tin nhắn trong Log của tôi:
LỖI/QCvdec (87): OMX Flush đưa ra khi vdec không được khởi tạo được nêu ra.
LỖI/QCvdec (87): OMXCORE-SM: Nhận được lệnh DISABLE (2)
LỖI/QCvdec (87): OMX Flush đưa ra khi vdec không được khởi tạo được nêu ra.
LỖI/QCvdec (87): OMXCORE-SM: lệnh Nhận được ENABLE (3)
Nhưng những bản ghi đang xảy ra cả khi video bắt đầu (lần đầu tiên nó đóng) và khi nó không thành công để bắt đầu lần nữa. vì vậy tôi không chắc chắn nếu họ có liên quan đến vấn đề của tôi
Edit:
Tôi chỉ cố gắng thiết lập mVideoView null, và sau đó nhận được một tài liệu tham khảo mới cho nó với findViewById() ngay trước khi setVideoPath(). Tôi biết điều này sẽ làm phức tạp cách thức OnCompletionListener được thiết lập. Nhưng bất kể nó vẫn không hoạt động, vẫn là màn hình tối.
Chỉnh sửa 2:
Tôi đã bắt đầu nhận thấy rằng đôi khi video thậm chí không bắt đầu lần đầu tiên. Tôi đang sử dụng hai dòng giống nhau này để bắt đầu nó lên lần đầu tiên:
mVideoView.setVideoPath(file.getAbsolutePath());
mVideoView.start();
Có vẻ như bắt đầu nhiều hơn, nhưng không hoàn toàn 100% khi lần đầu tiên nó được phát.
Chỉnh sửa 3: Đây là cách tôi thiết lập nó ngay bây giờ. Tôi tự đặt OnPreparedListener để bắt đầu video cho tôi. Vì vậy, tôi đã thêm này để onCreate của tôi()
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer arg0) {
mVideoView.start();
}
});
Sau đó, khi tôi đã sẵn sàng để khởi động lại các đoạn video tôi chỉ cần gọi chỉ phương pháp setVideoPath(), Như thế này:
mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mVideoView.setVideoPath(file.getAbsolutePath());
}
});
này có vẻ là làm lừa. Tôi cho phép nó chạy trong một thời gian để tìm ra chắc chắn mặc dù.
Sửa 4:
@MByD Trong mã cho VideoView setVideoPath() là một wrapper cho setVideoUri(). setVideoURI() đang thiết lập mStartWhenPrepared = false;
OnPreparedListener mặc định sẽ kiểm tra công tắc này để quyết định xem có bắt đầu phát lại hay không. Đó là lý do tại sao nó không bắt đầu với người nghe mặc định. Tôi đã không nhìn vào nó nhiều hơn thế, nhưng có thể có một phương thức setter cho phép tôi thay đổi giá trị mStartWhenPrepared thành true, điều này sẽ khiến video bắt đầu từ trình lắng nghe mặc định.
Câu hỏi thú vị. – PedroAGSantos