2010-12-16 7 views
17

Ich verwende Mediacontroller in meiner App, aber es zeigt nur für 3 Sekunden. Ich habe viel gesucht, aber in jedem Dokument sehe ich nur die Show-Funktion, Zeit einstellen, aber es hat keine Wirkung. Wie kann ich Mediacontroller immer anzeigen?MediaController immer auf Android

Ich habe show(0) getestet, aber es hatte keine Wirkung.

Antwort

23

können Sie die Mediacontroller-Klasse erweitern und programmatisch eine Instanz davon auf einem Videoview-Klasse festgelegt:

import android.content.Context; 
import android.util.AttributeSet; 
import android.widget.MediaController; 

public class MyMediaController extends MediaController { 
    public MyMediaController(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public MyMediaController(Context context, boolean useFastForward) { 
     super(context, useFastForward); 
    } 

    public MyMediaController(Context context) { 
     super(context); 
    } 

    @Override 
    public void show(int timeout) { 
     super.show(0); 
    } 

} 

Hier ist die Nutzung:

VideoView myVideoView = (VideoView) findViewById(R.id.my_video_view); 
MediaController mc = new MyMediaController(myVideoView.getContext()); 
mc.setMediaPlayer(myVideoView); 
myVideoView.setMediaController(mc); 
5

Was brauchen Sie zu tun ist, overrride die Methode im benutzerdefinierten Controller ausblenden und nichts tun.

public class MyMediaController extends MediaController { 
.. 
@Override 
    public void hide() { 
     // Do Nothing to keep the show the controller all times 

    } 
... 
} 

PS: Sie müssen immer noch auf das Video klicken, um den Media Controller anzuzeigen.

+0

Wie zeigt man den Media Controller, ohne ein Video auszuwählen - natürlich wird es nicht funktionieren, bis das Video ausgewählt ist - aber um diesen Platz zu belegen. – Jasper

7

können Sie auch eine anonyme Klasse inline und überschreiben die Haut Methode dort statt, die eine ganz neue Klasse dafür erstellen zu erstellen:

mediaController = new MediaController(this) { 
    @Override 
    public void hide() { 
    //Do not hide. 
    } 
}; 
+4

Warum der Downvote? Es ist üblich, bei der Abwärtswandlung zu erklären, – Gerard

11

Sie erstellen Inline anonyme Klasse und bestimmte Methoden außer Kraft setzen können. Sie müssen die Verbergen-Methode überschreiben und nichts darin tun. Sie müssen auch die Methode dispatchKeyEvent überschreiben, um nach der Zurück-Taste zu suchen, drücken Sie und rufen Sie super.hide() auf. Andernfalls wird beim Zurückdrücken der Controller nicht versteckt und die Aktivität kann nicht geschlossen werden.

mediaController = new MediaController(this){ 
     @Override 
     public void hide() { 
      // TODO Auto-generated method stub 
      //do nothing 
     } 

     @Override 
     public boolean dispatchKeyEvent(KeyEvent event) { 

      if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 

       if (mediaPlayer != null) { 
        mediaPlayer.reset(); 
        mediaPlayer.release(); 
        mediaPlayer = null; 
       } 
       super.hide(); 
       Activity a = (Activity)getContext(); 
       a.finish(); 

      } 
     return true; 
     } 
    }; 
+1

Meine Lautstärkeregler (auf dem Bildschirm und Geräte Tasten) funktionieren überhaupt nicht, wenn ich diese Funktionen überschreiben. – blackcompe

+1

Code im letzten Beitrag um (http://stackoverflow.com/questions/23338989/android-overriding-back-button-causes-volume-button-stop-working) funktioniert perfekt. – blackcompe

+0

Nur 'return true' wenn' event.getKeyCode() == KeyEvent.KEYCODE_BACK'. Andernfalls "return false" und dann die anderen Geräte-Tasten funktionieren weiter –

4

Nachdem ich alles versucht hatte, funktionierte der folgende Code für mich!

mVideoView = (VideoView) findViewById(R.id.video); 

    mMediaController = new MediaController(this) { 
     //for not hiding 
     @Override 
     public void hide() {} 

     //for 'back' key action 
     @Override 
     public boolean dispatchKeyEvent(KeyEvent event) { 
      if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 
       Activity a = (Activity)getContext(); 
       a.finish(); 
      } 
      return true; 
     } 
    }; 

    mMediaController.setAnchorView(mVideoView); 
    mMediaController.setMediaPlayer(mVideoView); 
    mVideoView.setMediaController(mMediaController); 
    mMediaController.requestFocus(); 

    //only this showed the controller for me!! 
    mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      mVideoView.start(); 
      mMediaController.show(900000000); 
     } 
    }); 

    //finish after playing 
    mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mediaPlayer) { 
      finish(); 
     } 
    }); 
+0

verwenden Sie dies, das hat für mich funktioniert: mediaController.show (0); – ralphgabb

0

Dies kann ein alter Thread, aber immer noch unbeantwortet, versuchen Sie dies:

final MediaController mediaController = new MediaController(this); 
mediaController.setAlwaysDrawnWithCacheEnabled(true); 
mediaController.setAnchorView(vView); 
mediaController.requestFocus(); 
    vView.setOnPreparedListener(new OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      mediaController.show(0); 
     } 
    }); 

vView.setVideoPath(Preview_Path); 
vView.setMediaController(mediaController); 
vView.start(); 

Theres einen Kommentar in der MediaController- Klasse "show" Methode

**Use 0 to show 
* the controller until hide() is called** 

so mit 900000 oder größerer Wert wird nicht helfen. hoffe es hilft dir.

Prost.

0

Versuchen Sie folgendes:

videoView.setOnCompletionListener(onVideoCompleted); 
videoView.setOnPreparedListener(onVideoPrepared); 

mc.setAnchorView(videoView); 
mc.setMediaPlayer(videoView); 

MediaController mc = new MediaController(this); 
videoView.setMediaController(mc); 

MediaPlayer.OnPreparedListener onVideoPrepared = new MediaPlayer.OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
     mc.show(0); 
    } 
}; 

MediaPlayer.OnCompletionListener onVideoCompleted = new MediaPlayer.OnCompletionListener() { 
    @Override 
    public void onCompletion(MediaPlayer mp) { 
     mc.hide(); 
    } 
}; 
0

Ich wollte den Controller für Videos verblassen und es immer für Audio zeigen. Dies funktioniert

mController = new MediaController(this) { 
     @Override 
     public void hide() { 

      if (mType != TYPE_AUDIO) super.hide(); 
     } 

     @Override 
     public boolean dispatchKeyEvent(KeyEvent event) { 
      if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 
       mController.hide(); 
       Activity a = (Activity)getContext(); 
       a.finish(); 
       return true; 
      } 
      return false; 
     } 
    }; 

Im MediaPlayer.onPrepared Ich fügte hinzu:

if (mType == TYPE_AUDIO) mController.show(0); 

Dies veranlasst die Steuerung zu Beginn der Audio-Wiedergabe zu zeigen, aber nicht Video-Wiedergabe.

Die anderen Tasten für die Telefonsteuerung funktionieren weiterhin normal.

0

Einfach! Setzen Sie die Sichtbarkeit "GONE" im Event und blenden Sie die Sichtbarkeit "VISIBLE" in der Show ein!

 MediaController mc= new MediaController(zoom.this){ 

      @Override 
      public void setMediaPlayer(MediaPlayerControl player) { 
       super.setMediaPlayer(player); 
       this.show(4000); 
      } 
      @Override 
      public void show(int timeout) { 
       super.show(timeout); 
       this.setVisibility(View.VISIBLE); 
      } 
      //instead of press twice with press once "back" button to back 
      @Override 
      public boolean dispatchKeyEvent(KeyEvent event) { 
       if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 
        Activity a = (Activity)getContext(); 
        a.finish(); 
       } 
       return true; 
      } 
      @Override 
      public void hide() { 
       // TODO Auto-generated method stub 
       super.hide(); 
       this.setVisibility(View.GONE); 
       //super.show(3000); 
      } 

     }; 
Verwandte Themen