Ho risolto questo problema con una soluzione stupida copiando l'intero codice sorgente di android.widget.VideoView
di Lollipop e rimuovendo la linea che hai menzionato.
Fai il tuo VideoView
classe. non utilizzare extends VideoView
poiché non è possibile sovrascrivere il metodo openVideo()
.
Non consiglio questo perché penso che sia una soluzione temporanea. VideoView
cambiato molto tra 4,1-5,0 quindi questo può rendere RuntimeException sulla versione Android diverso Lollipop
Modifica
ho fatto approccio MediaPlayer + SurfaceView come pinxue ci ha detto; Rispetta le proporzioni all'interno di viewWidth
e 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");
}
}
Il codice sorgente per 'VideoView' usa un sacco di riferimenti a campi e metodi di' MediaPlayer' nascosti, come sei entrato in giro che quando si copiato per rendere la tua classe? –
Sono stato stupido quella volta prima che pinxue ci dicesse MediaPlayer + SurfaceView. :/Ho appena cancellato tutto ciò che si verifica errori del compilatore su copia di VideoView Source .. la maggior parte di quelli erano riferimenti relativi ai sottotitoli di cui non ho bisogno. ..e ho lavorato bene per il mio scopo. Raccomando anche l'approccio di MediaPlayer + SurfaceView. – LaruYan
Grazie per aver chiarito, ho finito per cancellare anche il codice di errore compilato.Ti capita di conoscere un buon tutorial per l'utilizzo dell'approccio di MediaPlayer + SurfaceView? Potrei andare in giro per passare ad esso alla fine. –