Xây dựng chương trình xem video trên hệ điều hành Android. Việc tạo ra chương trình xem video không có gì là khó, đơn giản chỉ là xử lý file, list, view các button, sdcard, đối tượng media VideoView như bài audio mà hôm trước chúng ta đã cùng nghiên cứu.
Bước 1: Xây dựng giao diện main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
 android:padding="20dip">
    <LinearLayout
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_gravity="center"
  android:paddingLeft="20dip"
  android:paddingRight="20dip">
  <TextView
   android:text="@string/hello"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
      android:layout_gravity="center"
   android:layout_marginBottom="20dip"
   android:textSize="20sp"
   android:textStyle="italic" android:gravity="center"/>
  
  <TableLayout
   android:layout_height="wrap_content"
   android:layout_width="wrap_content"
   android:layout_gravity="center"
   android:stretchColumns="*">
   <TableRow>     
    <ListView xmlns:android="http://schemas.android.com/apk/res/android"
           android:id="@id/android:list"
           android:layout_width="wrap_content"
           android:layout_height="100dp"
           android:scrollbarAlwaysDrawVerticalTrack="true"
           android:scrollbars="vertical" >
       </ListView>   
      </TableRow>
      <TableRow >
       <VideoView
     android:id="@+id/video_frame"
        android:layout_width="wrap_content"
        android:layout_height="150dp"
     android:layout_gravity="center"
     android:visibility="visible"/>
      </TableRow>
     </TableLayout>
  <TableLayout
   android:layout_height="wrap_content"
   android:layout_width="wrap_content"
   android:layout_gravity="center"
   android:layout_marginTop="50dip"
   android:stretchColumns="*">
   <TableRow>
    <Button
     android:id="@+id/play_button"
     android:text="@string/play_label" android:visibility="invisible"/>
    <Button
     android:id="@+id/stop_button"
     android:text="@string/stop_label" android:visibility="invisible" />
   </TableRow>
   <TableRow>
    <Button
     android:id="@+id/about_button"
     android:text="@string/about_label" />
    <Button
     android:id="@+id/exit_button"
     android:text="@string/exit_label" />
   </TableRow>
  </TableLayout> 
 </LinearLayout>
</LinearLayout>
Bước 2: Tạo chuỗi strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Basic -->
    <string name="hello">Welcome to Video!</string>
    <string name="app_name">Video</string>
    <!-- Control -->
    <string name="play_label">Play</string>
    <string name="pause_label">Pause</string>
    <string name="stop_label">Stop</string>
    <string name="about_label">About</string>
    <string name="exit_label">Exit</string>
 
    <!--  About -->
    <string name="about_title">About this Application</string>
    <string name="about_text">
        <b>Create by:</b>\n
  Lê Thiện Nhật Quang (11TLT)\n
  Võ Hoài Sơn
 </string>
 
    <!-- Other -->
 
</resources>
Bước 3: Tạo lớp Video.java
package quangit.video.videoactive;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;
public class Video extends ListActivity implements OnClickListener{
 // Interface components
 private View playButton, stopButton, aboutButton, exitButton;
 // Store list Videos
 private List<String> listFilesApp = new ArrayList<String>();
 // Position of a Video in list
 private int position=-1; // Not choose any Video
 // Path of Videos Folder
 private static final String pathFilesApp="/sdcard/Video/";  
 // Media Object
 private VideoView mp;
 /**-----------------------------------------------------------------
  *  Application's basic methods
  * ----------------------------------------------------------------- */
 @Override
    public void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        // Call layout main.xml
        setContentView(R.layout.main); 
     
        // Search View
        playButton = this.findViewById(R.id.play_button);
        stopButton = this.findViewById(R.id.stop_button);
        aboutButton = this.findViewById(R.id.about_button);
        exitButton = this.findViewById(R.id.exit_button);
        // Setup click listeners for all the buttons
  playButton.setOnClickListener(this);
  stopButton.setOnClickListener(this);
  aboutButton.setOnClickListener(this);
  exitButton.setOnClickListener(this);
  
        // Fill view from resource
        mp = (VideoView)findViewById(R.id.video_frame);
     
  // Add list Videos to layout
  addVideosToList();
  ArrayAdapter<String> t_l = new ArrayAdapter<String>(this, R.layout.item, listFilesApp);
        setListAdapter(t_l);
  
        //mp.setVideoPath("/sdcard/Movies/Grapes to Raisins Time Lapse.3gp" );
        //mp.start();
     
    }
 @Override
 protected void onStart() {
  // TODO Auto-generated method stub
  super.onStart();
 }
 @Override
 protected void onRestart() {
  // TODO Auto-generated method stub
  super.onRestart();
 }
 @Override
 protected void onPause() {
  // TODO Auto-generated method stub
  super.onPause();
 }
 @Override
 protected void onResume() {
  // TODO Auto-generated method stub
  super.onResume();
 }
 @Override
 protected void onStop() {
  // TODO Auto-generated method stub
  super.onStop();
 }
 @Override
 protected void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
 }
 
 public void exitApp(){
  stopVideo();
  
  Intent i_exit = new Intent(Intent.ACTION_MAIN);
  i_exit.addCategory(Intent.CATEGORY_HOME);
  i_exit.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(i_exit);
 }
 /**-------------------------------------------------------------
  *  Events handler methods
  * ------------------------------------------------------------- */
 // Handling buttons events
 public void onClick(View v) {
  switch (v.getId()) {
   case R.id.play_button:
    pauseVideo();
    break;
   case R.id.stop_button:
    stopVideo();
    break; 
   case R.id.about_button:
    Intent i_about = new Intent(this, VideoActivity.class);
    startActivity(i_about); //Set activity for class About.java
    break;
   case R.id.exit_button:
    exitApp();
    break; 
   default:    
    break;
  }
 }
 // Handling keyboard events
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
     // TODO Auto-generated method stub
     switch (keyCode) {
      case KeyEvent.KEYCODE_BACK:
       exitApp();
       break;
      case KeyEvent.KEYCODE_HOME:
       exitApp();
       break;    
      default:
       return super.onKeyDown(keyCode, event);
     }     
     return true;
     
     /**
     if (keyCode == event.KEYCODE_BACK){
   finish(); // Exit Video
   return true;
  }
  return super.onKeyDown(keyCode, event);
  */
    }
 
 /**-----------------------------------------------------
  *  Video application methods
  * ----------------------------------------------------- */
    // Class File Filter
    class FileFilter implements FilenameFilter{
  @Override
  public boolean accept(File dir, String filename) {
   // TODO Auto-generated method stub
   return (filename.endsWith(".3gp"));
  }   
    }
    // Add Videos to list
    public void addVideosToList(){
     File t_f = new File(pathFilesApp);
     for (File file: t_f.listFiles(new FileFilter())) {
      listFilesApp.add(file.getName());
  }     
    }
    // Click a Video on list Videos
 @Override
 protected void onListItemClick(ListView _l, View _v, int _p, long _id) {
  // TODO Auto-generated method stub
  super.onListItemClick(_l, _v, _p, _id);
  // Play the Video is clicked ~ It is the current Video is playing
  playVideo(pathFilesApp + listFilesApp.get(_p));
  // Save position of current Video is playing
  position = _p;  
  // Show info of the current Video is playing
  Toast.makeText(getApplicationContext(), listFilesApp.get(_p), Toast.LENGTH_LONG).show();  
 }
 // Play a Video
    public void playVideo(String _path){
     try {
   mp.setVideoPath(_path);
   
   //mp.setMediaController(new MediaController(this));
   MediaController mc = new MyMediaController(mp.getContext());
   mc.setMediaPlayer(mp);
   mp.setMediaController(mc);
   
   mp.requestFocus();
   mp.start();   
   // Label button
   Button t_bt = (Button)playButton;
   t_bt.setText("Pause");
   
   // Auto play next Video
   
  }catch(Exception e){
   // TODO: handle exception
   Log.v("VideoPlayer", e.getMessage());
  }
    }
    // Pause Video
    public void pauseVideo(){
  if(mp.isPlaying()){
   mp.pause();
   Button t_bt = (Button)playButton;
   t_bt.setText("Play");
  }else{
   if(position != -1){
    mp.start();
    Button t_bt = (Button)playButton;
    t_bt.setText("Pause");
   }
  }
    }
    // Stop Video
    public void stopVideo(){
     if(mp.isPlaying()){
      mp.stopPlayback();
   position=-1; // Not choose any Video
   Button t_bt = (Button)playButton;
   t_bt.setText("Play");
  }
    }
    // Restart Video
    public void restartVideo(){
  mp.seekTo(0); // Reset Video's time line
    }
    // Play next Video
    public void playNextVideo(){
     if(++position >= listFilesApp.size()){
      position=0;
     }else{
      playVideo(pathFilesApp + listFilesApp.get(position)) ;
     }
    }
}
class MyMediaController extends MediaController {
    public MyMediaController(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public MyMediaController(Context context, boolean useFastForward) {
        super(context, useFastForward);
    }
    public MyMediaController(Context context) {
        super(context);
    }
    @Override
    public void show(int timeout) {
        super.show(0);
    }
}
Bước 4: Import file video vào trong sdcard như trong bài Audio. Sau đó Run Application để xem thành quả
