Хранение MediaController на экране в VideoView - PullRequest
6 голосов
/ 11 июля 2011

У меня проблемы с поиском способа удержания 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 ]

12 голосов
/ 02 января 2012

это сработало для меня. Просто расширьте класс медиа-контроллера. И переопределить метод скрытия.

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

}
4 голосов
/ 14 июля 2011

Хорошо, я нашел!Потратив на это часы !!Так что, насколько я знаю, понятия не имею, как это сделать на разных форумах.Вот трюк, который я нашел:

ПЕРВЫЙ КЛАСС (пример ...)

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

0 голосов
/ 05 декабря 2015

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

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

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