Home > Mobile >  demo
demo

Time:09-24

Package per. Juan. Playvideodome;

The import androidx. Appcompat. App. AppCompatActivity;

The import android. The content. The Context;
The import android. Content. Res. AssetFileDescriptor;
The import android. Media. MediaPlayer;
The import android. OS. Build;
The import android. OS. Bundle;
The import android. View. SurfaceHolder;
The import android. View. SurfaceView;
The import android. View. The view;
The import android. View. WindowManager;

Public class MainActivity extends AppCompatActivity {
SurfaceView mSvVideoPlayer;

Private MediaPlayer mMediaPlayer;
Private int mPosition=0;
Private Boolean hasActiveHolder=false;

@ Override
Protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
The setContentView (R.l ayout. Activity_main);

MSvVideoPlayer=the findViewById (R.i d.s v_video_player);
PlayVideo ();
}

/* *
* play video
*/
Public void playVideo () {
If (mMediaPlayer==null) {
//instantiate the MediaPlayer object
MMediaPlayer=new MediaPlayer ();
MSvVideoPlayer. SetVisibility (the VISIBLE);
Boolean mHardwareDecoder=false;
//not maintain its buffer, directly display
If (Build) VERSION) SDK_INT & lt; Build. VERSION_CODES. HONEYCOMB & amp; & MHardwareDecoder) {
MSvVideoPlayer. GetHolder (). SetType (SurfaceHolder. SURFACE_TYPE_PUSH_BUFFERS);
}
MSvVideoPlayer. GetHolder (). SetFixedSize (getScreenWidth (), getScreenHeight ());
MSvVideoPlayer. GetHolder (). SetKeepScreenOn (true);//to keep the screen normally on
MSvVideoPlayer. GetHolder (). The addCallback (new SurFaceCallback ());
}
}

/* *
* to set player dispay, namely SurfaceHolder, but likely SurfaceView haven't create success, so I need to monitor SurfaceView create events
*/
Private final class SurFaceCallback implements SurfaceHolder. Callback {

@ Override
Public void surfaceChanged (SurfaceHolder holder, int format, int width, int height) {

}

@ Override
Public void surfaceCreated (SurfaceHolder holder) {
If (mMediaPlayer==null) {
return;
}
if (! HasActiveHolder) {
Play (mPosition);
HasActiveHolder=true;
}
If (mPosition & gt; 0 {
Play (mPosition);
MPosition=0;
}
}

@ Override
Public void surfaceDestroyed (SurfaceHolder holder) {
If (mMediaPlayer==null) {
return;
}
If (mMediaPlayer isPlaying ()) {
MMediaPlayer. Stop ();
MPosition=mMediaPlayer. GetCurrentPosition ();
}
}

Private void play (int position) {
Try {
//add the path of the broadcast video and configuration MediaPlayer
AssetFileDescriptor fileDescriptor=getResources (). OpenRawResourceFd (R.r aw. Info);
MMediaPlayer. Reset ();
//add preview to mMediaPlayer SurfaceHolder to players and SurfaceView associated
MMediaPlayer. SetDisplay (mSvVideoPlayer getHolder ());

MMediaPlayer. SetDataSource (fileDescriptor. GetFileDescriptor (),
FileDescriptor. GetStartOffset (),
FileDescriptor. GetLength ());
//the buffer
MMediaPlayer. Prepare ();
MMediaPlayer. SetOnBufferingUpdateListener (new BufferingUpdateListener ());
MMediaPlayer. SetOnPreparedListener (new PreparedListener (position));
MMediaPlayer. SetOnCompletionListener (new CompletionListener ());
} the catch (Exception e) {
e.printStackTrace();
}
}
}

/* *
* buffer change callback
*/
Private final class BufferingUpdateListener implements MediaPlayer. OnBufferingUpdateListener {

@ Override
Public void onBufferingUpdate (MediaPlayer mp, int percent) {
}
}

/* *
* to complete callback
* only when the players ready to play, so play set can only be triggered after prepare
*/
Private final class PreparedListener implements MediaPlayer. OnPreparedListener {
Private int position;

Public PreparedListener (int position) {
Enclosing the position=position;
}

@ Override
Public void onPrepared (MediaPlayer mp) {
MMediaPlayer. Start ();
If (position & gt; 0 {
MMediaPlayer. SeekTo (position);
}
}
}

/* *
* at the end of the play callback
*/
Private final class CompletionListener implements MediaPlayer. OnCompletionListener {

@ Override
Public void onCompletion MediaPlayer (mp) {
MMediaPlayer. Start ();
}
}

@ Override
Public void onDestroy () {
//release the memory, MediaPlayer underlying function method is to run the c + +, do not use the necessary after free memory
If (mMediaPlayer!=null) {
If (mMediaPlayer isPlaying ()) {
MMediaPlayer. Pause ();
MPosition=mMediaPlayer. GetCurrentPosition ();
}
MMediaPlayer. Release ();
MMediaPlayer=null;
}
Super. OnDestroy ();
}

Private int getScreenWidth () {
Return ((WindowManager) getSystemService (Context. WINDOW_SERVICE)). GetDefaultDisplay () getWidth ();
}

Private int getScreenHeight () {
Return ((WindowManager) getSystemService (Context. WINDOW_SERVICE)). GetDefaultDisplay ()
GetHeight ();
}
}