2011-07-11 17 views
5

Mam problem ze znalezieniem sposobu na utrzymanie MediaController na ekranie podczas korzystania z VideoView. Chcę odtwarzać plik audio, który znajduje się w res/raw w mojej aplikacji. Plik jest odtwarzany, ale chciałbym zachować kontroler na ekranie, aby użytkownik mógł zobaczyć długość pliku i ile czasu pozostało do końca itd. Znalazłem wiele czasu na forach, że powinniśmy użyć metody .show (czas), aby to zrobić, ale nie mogę wymyślić, jak to zrobić.Przechowywanie MediaController na ekranie w VideoView

Oto kod używam:

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 

} 
} 

Kiedy dodać linię mVideoView.getHolder() addCallback (this);. błąd aplikacji, nie jestem pewien dlaczego.

Każda pomoc lub alternatywę dla tego, co chciałbym zrobić, to więcej niż mile widziane :)

Dzięki, JB

+0

Czy mówisz, że VideoView będzie również odtwarzać pliki audio? –

Odpowiedz

4

Ok znalazłem! Po spędzeniu tam godzin! Więc nie mam pojęcia, jak to zrobić na różnych forach. Oto sztuczka znalazłem:

FIRST CLASS (przykład ...)

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 

} 
} 

drugiej klasy (z trik)

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() { 
    } 

} 

sztuką jest po prostu stworzyć nową MediaController, który rozszerza Mediacontroller i która funkcja hide() nie robi nic!

Jeśli chcesz spojrzeć na kodzie źródłowym MediaController Dla lepszego zrozumienia można zajrzeć tutaj: // kod źródłowy MediaController http://hi-android.info/src/android/widget/MediaController.java.html

Nadziei będzie to pomocne dla SB, JB

+3

Rozszerzanie kontrolera multimediów i przesłonięcie metody ukrywania Wyłącz cały ekran i nie można wykryć żadnego zdarzenia dotyku działania, z wyjątkiem elementów sterujących kontrolera multimediów. – SALMAN

+0

@SALMAN tak to prawda, ale jakakolwiek praca dla niego? –

12

to działało dla mnie. Po prostu rozszerz klasę kontrolera mediów. I zastąp metodę 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); 
    } 

} 
+0

, ale uniemożliwia to powrót do aplikacji. –

0

Z dotychczasowych odpowiedzi wynika, że ​​problem z funkcjonalnością wsteczną nie będzie działał, więc należy go naprawić zgodnie z poniższym kodem.

public class CustomMediaController extends MediaController { 


public CustomMediaController(Context context) { 
    super(context); 

    // TODO Auto-generated constructor stub 
} 


public void hide() { 

} 

// potrzebne, aby funkcjonalność tylną roboczą

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 

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

     super.hide(); 
     Activity activity = (Activity)getContext(); 
     activity.finish(); 

    } 
    return super.dispatchKeyEvent(event); 
}} 
0

Wszystko co musisz zrobić, to zastąpić MediaController z własnej klasy, a następnie zastąpić 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; 
} 
}