Intereting Posts
Можем ли мы использовать почти все стандартные пакеты Java в приложении для Android? Navigator.geolocation.GetCurrentPosition throws «Ошибка последнего провайдера местоположения отключена» Как получить выбранный элемент диалогового окна Alert Dialog? Вывод фильтра в logcat по тэгу Android EditText – сосредоточьтесь на нем и выберите весь текст программно Ошибка разрешения WRITE_SECURE_SETTINGS, даже если она добавлена ​​в манифест Центрирование текстового изображения Ниже кнопки изображения, которая находится под относительным расположением? Как преобразовать растровое изображение в PNG, а затем в base64 в Android? Перезагрузка Webview по изменению ориентации в сотах Как выйти из приложения Android Пользовательский макет панели действий с меню переполнения Экспорт базы данных SQLite в файл XML на Android Как показать фактический режим дорожного движения на карте в Android Android Gradle build и круговая зависимость Как работает matrix.setlookatm?

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