Хранение MediaController на экране в VideoView
У меня проблемы с поиском способа сохранить MediaController на экране при использовании его с VideoView. Я хочу воспроизвести аудио файл, который находится в res / raw в моем приложении. Файл воспроизводится, но я хотел бы оставить контроллер на экране, чтобы пользователь мог видеть длину файла и сколько времени осталось до конца и т. Д. Я нашел много времени на форумах, что мы должны использовать метод.show (время), чтобы сделать это, но я не могу понять, как заставить это работать.
Вот код, который я использую:
package com.sample.VideoViewExample;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.widget.MediaController;
import android.widget.VideoView;
public class VideoViewExample extends Activity implements SurfaceHolder.Callback{
private VideoView mVideoView;
private MediaController mMedia;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
mVideoView = (VideoView) findViewById(R.id.surface_view);
//mVideoView.getHolder().addCallback(this);
//mMedia.show(50000);
//mVideoView.setMediaController(mMedia);
MediaController mMedia = new MediaController(this);
mMedia.setMediaPlayer(mVideoView);
mMedia.setAnchorView(mVideoView);
mVideoView.setMediaController(mMedia);
mVideoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() +"/"+R.raw.osa_patient));
mVideoView.requestFocus();
mVideoView.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
mMedia.show(500000);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
}
Когда я добавляю строку mVideoView.getHolder(). AddCallback(this); ошибка приложения, я не уверен почему.
Любая помощь или альтернатива тому, что я хотел бы сделать, приветствуется:)
Спасибо, JB
4 ответа
Это сработало для меня. Просто расширьте класс медиа-контроллера. И переопределить метод скрытия.
MediaController mediaController = new MyMediaController(this, true);
public class MyMediaController extends MediaController {
public MyMediaController(Context context, boolean useFastForward) {
super(context, useFastForward);
}
@Override
public void hide() {
mediaController.show(0);
}
}
Хорошо, я нашел! Потратив на это часы!! Так что, насколько я знаю, понятия не имею, как это сделать на разных форумах. Вот трюк, который я нашел:
ПЕРВЫЙ КЛАСС (пример...)
package com.sample.VideoViewExample;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.Window;
import android.view.WindowManager;
import android.widget.VideoView;
public class VideoViewExample extends Activity implements SurfaceHolder.Callback{
private VideoView mVideoView;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
mVideoView = (VideoView) findViewById(R.id.surface_view);
mVideoView.setKeepScreenOn(true);
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
SurfaceHolder holder = mVideoView.getHolder();
holder.addCallback(this);
MediaController_2 mMedia = new MediaController_2(this);
mMedia.setMediaPlayer(mVideoView);
mMedia.setAnchorView(mVideoView);
mVideoView.setMediaController(mMedia);
mVideoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() +"/"+R.raw.osa_patient));
mVideoView.requestFocus();
mVideoView.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
}
Второй класс (с пометкой)
package com.sample.VideoViewExample;
import android.content.Context;
import android.widget.MediaController;
public class MediaController_2 extends MediaController{
public MediaController_2(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public void hide() {
}
}
хитрость заключается в том, чтобы просто создать новый MediaController, который расширяет Mediacontroller и какая функция hide() ничего не делает!
Если вы хотите взглянуть на исходный код MediaController для лучшего понимания, вы можете посмотреть здесь: // исходный код MediaController http://hi-android.info/src/android/widget/MediaController.java.html
Надеюсь, что это поможет SB, JB
Все, что вам нужно сделать, это переопределить MediaController своим собственным классом, а затем переопределить onTouchEvent.
public class SmartLinkVideoController extends MediaController implements MediaPlayerControl {
//declare needed variables
private SmartLinkVideoPlayer mVideoPlayer;
public SmartLinkVideoController(Context context) {
super(context);
}
public SmartLinkVideoController(Context context, SmartLinkVideoPlayer videoPlayer) {
this(context);
this.setMediaPlayer(this);
this.mVideoPlayer = videoPlayer;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//super implementation sets default time to hide of ~ 3 seconds
show(0);
return true;
}
@Override
public void start() {
mVideoPlayer.start();
}
@Override
public void pause() {
mVideoPlayer.pause();
}
@Override
public int getDuration() {
return mVideoPlayer.getDuration();
}
@Override
public int getCurrentPosition() {
return mVideoPlayer.getCurrentPosition();
}
@Override
public void seekTo(int pos) {
mVideoPlayer.seekTo(pos);
}
@Override
public boolean isPlaying() {
return mVideoPlayer.isPlaying();
}
@Override
public int getBufferPercentage() {
return mVideoPlayer.getPercentBuffered();
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getAudioSessionId() {
return 0;
}
public boolean hasVideoPlayer() {
return (mVideoPlayer != null);
}
public void prepareVideo() {
if(mVideoPlayer.getVideoType() == SmartLinkVideoPlayer.VIDEO_TYPE_INTERNAL
|| mVideoPlayer.getVideoType() == SmartLinkVideoPlayer.VIDEO_TYPE_EXPANSION)
mVideoPlayer.prepare();
else
mVideoPlayer.prepareAsync();
}
public void prepareSurface(SurfaceHolder holder) {
mVideoPlayer.setDisplay(holder);
}
public void rewindVideo() {
mVideoPlayer.seekTo(0);
}
public void setVideoPlayer(SmartLinkVideoPlayer videoPlayer) {
mVideoPlayer = videoPlayer;
}
public void stopVideoPlayer() {
mVideoPlayer.stop();
}
public void resetVideoPlayer() {
mVideoPlayer.reset();
}
public void releaseVideoPlayer() {
mVideoPlayer.release();
mVideoPlayer = null;
}
}
Из ответов, данных до сих пор, теперь проблема заключается в том, что обратная функциональность не будет работать, поэтому для ее исправления следуйте этому коду.
public class CustomMediaController extends MediaController {
public CustomMediaController(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public void hide() {
}
// Нужно, чтобы работала задняя функциональность
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
super.hide();
Activity activity = (Activity)getContext();
activity.finish();
}
return super.dispatchKeyEvent(event);
}}