
Modify /res/layout/playerlayout.xml to replace ProgressBar with SeekBar.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical" >
  <SeekBar
      android:id="@+id/timeline"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      style="?android:attr/progressBarStyleHorizontal"
      android:max="100"
      android:progress="0"
      />
  <SurfaceView
      android:id="@+id/surfaceview"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:layout_gravity="center" />
</LinearLayout>
Modify PlayerFragment.java to implement SeekBar.OnSeekBarChangeListener.
package com.exercise.AndroidListMedia;
import java.io.IOException;
import android.app.Fragment;
import android.graphics.PixelFormat;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.SeekBar;
import android.widget.Toast;
import android.media.AudioManager;
public class PlayerFragment extends Fragment
 implements SurfaceHolder.Callback {
 Uri targetUri = null;
 
 MediaPlayer mediaPlayer;
 SurfaceView surfaceView;
 SurfaceHolder surfaceHolder;
 SeekBar timelineBar;
 
 runnableTimeline timelineMonitor;
 
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
   Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  View view = inflater.inflate(R.layout.playerlayout, container, false);
  surfaceView = (SurfaceView)view.findViewById(R.id.surfaceview);
  
  timelineBar = (SeekBar)view.findViewById(R.id.timeline);
  timelineBar.setOnSeekBarChangeListener(timelineBarSeekBarChangeListener);
  
  getActivity().getWindow().setFormat(PixelFormat.UNKNOWN);
  surfaceHolder = surfaceView.getHolder();
  surfaceHolder.addCallback(this);
  surfaceHolder.setFixedSize(176, 144);
  surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  timelineMonitor = new runnableTimeline();
  Thread thread = new Thread(timelineMonitor);
  thread.start();
  
  return view;
 }
 
 SeekBar.OnSeekBarChangeListener timelineBarSeekBarChangeListener
 = new SeekBar.OnSeekBarChangeListener(){
  @Override
  public void onProgressChanged(SeekBar seekBar, int progress,
    boolean fromUser) {
   if(fromUser){
    if(mediaPlayer != null){
     int totalDuration = mediaPlayer.getDuration();
     int currentDuration = totalDuration * progress/100;
     mediaPlayer.seekTo(currentDuration);
    }
   }
   
  }
  @Override
  public void onStartTrackingTouch(SeekBar seekBar) {
   // TODO Auto-generated method stub
   
  }
  @Override
  public void onStopTrackingTouch(SeekBar seekBar) {
   // TODO Auto-generated method stub
   
  }
  
 };
 
 public void doPlayPause(){
  if (targetUri != null){
   if(mediaPlayer.isPlaying()){
     mediaPlayer.pause();
    }else{
     mediaPlayer.start();
    }
  }
  
 }
 
 public void doStop(){
  if (targetUri != null){
   mediaPlayer.stop();
   try {
    mediaPlayer.prepare();
   } catch (IllegalStateException e) {
    e.printStackTrace();
    Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_LONG).show();
   } catch (IOException e) {
    e.printStackTrace();
    Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_LONG).show();
   }
   
   mediaPlayer.seekTo(0);
  }
 }
 
 private void doPreSet(){
  
  if(mediaPlayer != null){
   mediaPlayer.stop();
   mediaPlayer.release();
  }
  
  mediaPlayer = new MediaPlayer();
  
  mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
  mediaPlayer.setDisplay(surfaceHolder);
  
  try {
   mediaPlayer.setDataSource(getActivity().getApplicationContext(), targetUri);
   mediaPlayer.prepare();         
  } catch (IllegalArgumentException e) {
   e.printStackTrace();
   Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_LONG).show(); 
  } catch (IllegalStateException e) {
   e.printStackTrace();
   Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_LONG).show(); 
  } catch (IOException e) {
   e.printStackTrace();
   Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_LONG).show(); 
  }
  
   /*
    *  Handle aspect ratio
    */
  int surfaceView_Width = surfaceView.getWidth();
  int surfaceView_Height = surfaceView.getHeight();
  
  float video_Width = mediaPlayer.getVideoWidth();
  float video_Height = mediaPlayer.getVideoHeight();
  
  float ratio_width = surfaceView_Width/video_Width;
  float ratio_height = surfaceView_Height/video_Height;
  float aspectratio = video_Width/video_Height;
  
  LayoutParams layoutParams = surfaceView.getLayoutParams();
  
  if (ratio_width > ratio_height){
   layoutParams.width = (int) (surfaceView_Height * aspectratio);
   layoutParams.height = surfaceView_Height; 
  }else{
   layoutParams.width = surfaceView_Width;
   layoutParams.height = (int) (surfaceView_Width / aspectratio); 
  }
  
  surfaceView.setLayoutParams(layoutParams);
 }
 @Override
 public void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
 }
 @Override
 public void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
  mediaPlayer.release();
 }
 @Override
 public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
  // TODO Auto-generated method stub
  
 }
 @Override
 public void surfaceCreated(SurfaceHolder arg0) {
  // TODO Auto-generated method stub
  
 }
 @Override
 public void surfaceDestroyed(SurfaceHolder arg0) {
  // TODO Auto-generated method stub
  
 }
 
 public void setTargetUri(Uri u, int id){
  targetUri = u;
  
  getActivity().setTitle("ID: " + id + " / Uri: " + u.toString());
  
  doPreSet();
  mediaPlayer.start();
 }
 
 private class runnableTimeline implements Runnable{
  @Override
  public void run() {
   while(true){
    if(mediaPlayer != null){
     int totalDuration = mediaPlayer.getDuration();
     int currentDuration = mediaPlayer.getCurrentPosition();
     int currentTime = (int)(100 * currentDuration/totalDuration);
     timelineBar.setProgress(currentTime);
    }else{
     timelineBar.setProgress(0);
    }
    
    try {
     Thread.sleep(1000);
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }
 }
}
 Download the files.
Download the files.Next:
- A milestone of MediaPlay Exercise for video
 
No comments:
Post a Comment