Tôi đã giải quyết vấn đề này bằng cách sao chép toàn bộ mã nguồn của android.widget.VideoView
của Lollipop và xóa dòng bạn đã đề cập.
Tạo lớp học VideoView
của riêng bạn. không sử dụng extends VideoView
vì bạn không thể ghi đè phương thức openVideo()
.
Tôi không khuyến nghị điều này vì tôi nghĩ đó là giải pháp tạm thời. VideoView
thay đổi rất nhiều giữa 4,1-5,0 vì vậy đây có thể làm cho RuntimeException trên phiên bản Android khác hơn Lollipop
Sửa
tôi đã thực hiện cách tiếp cận MediaPlayer + SurfaceView như pinxue nói với chúng tôi; Nó tôn trọng tỷ lệ co trong phạm vi viewWidth
và viewHeight
.
final String finalFilePath = filePath;
final SurfaceHolder surfaceHolder = sv.getHolder();
final MediaPlayer mediaPlayer = new MediaPlayer();
final LinearLayout.LayoutParams svLayoutParams = new LinearLayout.LayoutParams(viewWidth,viewHeight);
surfaceHolder.addCallback(new SurfaceHolder.Callback(){
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
if(isDebug) {
System.out.println("setting VideoPath to VideoView: "+finalFilePath);
}
mediaPlayer.setDataSource(finalFilePath);
}catch (IOException ioe){
if(isDebug){
ioe.printStackTrace();
}
//mediaPlayer = null;
}
mediaPlayer.setDisplay(surfaceHolder);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
if(isDebug){
System.out.println("Video is starting...");
}
// for compatibility, we adjust size based on aspect ratio
if (mp.getVideoWidth() * svLayoutParams.height < svLayoutParams.width * mp.getVideoHeight()) {
//Log.i("@@@", "image too wide, correcting");
svLayoutParams.width = svLayoutParams.height * mp.getVideoWidth()/mp.getVideoHeight();
} else if (mp.getVideoWidth() * svLayoutParams.height > svLayoutParams.width * mp.getVideoHeight()) {
//Log.i("@@@", "image too tall, correcting");
svLayoutParams.height = svLayoutParams.width * mp.getVideoHeight()/mp.getVideoWidth();
}
sv.post(new Runnable(){
@Override
public void run() {
sv.setLayoutParams(svLayoutParams);
}
});
mp.start();
}
});
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if(isDebug){
System.out.println("surfaceChanged(holder, "+format+", "+width+", "+height+")");
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
try {
mediaPlayer.setDataSource("");
}catch (IOException ioe){
if(isDebug){
ioe.printStackTrace();
}
}
}
});
if(sv.post(new Runnable() {
@Override
public void run() {
sv.setLayoutParams(svLayoutParams);///
sv.setVisibility(View.VISIBLE);
}})){
if(isDebug) {
System.out.println("post Succeded");
}
}else{
if(isDebug) {
System.out.println("post Failed");
}
}
Mã nguồn cho 'VideoView' sử dụng rất nhiều tài liệu tham khảo để các lĩnh vực và phương pháp của' MediaPlayer' ẩn, làm thế nào bạn có được xung quanh rằng khi bạn sao chép nó để làm cho lớp học của riêng bạn? –
Tôi đã ngu ngốc mà thời gian trước khi pinxue nói với chúng tôi MediaPlayer + SurfaceView. :/Tôi vừa xóa mọi thứ xảy ra lỗi trình biên dịch trên VideoView Source đã sao chép .. hầu hết trong số đó là các tham chiếu liên quan đến phụ đề mà tôi không cần. ..và làm việc tốt cho mục đích của tôi. Tôi cũng khuyên bạn nên sử dụng phương pháp MediaPlayer + SurfaceView. – LaruYan
Cảm ơn bạn đã làm rõ, tôi cũng đã xóa mã lỗi biên dịch.Bạn có biết một hướng dẫn tốt để sử dụng phương pháp MediaPlayer + SurfaceView không? Tôi có thể xoay quanh để chuyển sang nó cuối cùng. –