Intereting Posts
Ошибка logcat для Android: ZipFileCache: init не удалось, когда открыт zip-файл – конкретное устройство? Передача массива JSON между действиями через намерение React Native android build не удалось. Местоположение SDK не найдено При запуске переднего плана Не удалось запустить JAVA, хотя путь установлен на Windows 8 Enterprise – Cordova Как добавить анимацию в DialogFragment? IPhone-подобный брелок в Android? Как создать панель инструментов (например, вторичную панель действий) в Android? Ошибка отправки многостраничного файла с помощью границы через волейбол Включить опцию синхронизации по умолчанию, когда false в приложении. Отклонить не отменяемый диалог на фрагменте backPress – Android Прокрутка вниз в recyclerview с несколькими типами просмотра Безопасен ли байт-код Работа с неявным намерением будущего устаревания в Lollipop Не удалось упаковать изображения с разрешением 800×800 с помощью пакета libGDX texture packer с параметром stripwhitespace?

Сохранение 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

Solutions Collecting From Web of "Сохранение MediaController на экране в VideoView"

Это сработало для меня. Просто увеличьте класс медиаконтроллера. И переопределить метод hide.

  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

Из ответов, представленных до сих пор, теперь проблема заключается в том, что функциональность задней части не будет работать, чтобы исправить ее, следуя этому коду.

 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); }} 

Все, что вам нужно сделать, это переопределить 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; } }