EX08_15.java
上传用户:vip_99
上传日期:2021-03-27
资源大小:61159k
文件大小:10k
源码类别:

android开发

开发平台:

Java

  1. package irdc.ex08_15;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.InputStream;
  5. import java.net.URL;
  6. import java.net.URLConnection;
  7. import android.app.Activity;
  8. import android.graphics.PixelFormat;
  9. import android.media.MediaPlayer;
  10. import android.os.Bundle;
  11. import android.util.Log;
  12. import android.view.SurfaceHolder;
  13. import android.view.SurfaceView;
  14. import android.view.View;
  15. import android.webkit.URLUtil;
  16. import android.widget.EditText;
  17. import android.widget.ImageButton;
  18. import android.widget.TextView;
  19. /* Activity实现SurfaceHolder.Callback */
  20. public class EX08_15 extends Activity
  21. implements SurfaceHolder.Callback
  22. {
  23.   private TextView mTextView01; 
  24.   private EditText mEditText01;
  25.   /* 创建MediaPlayer对象 */ 
  26.   private MediaPlayer mMediaPlayer01;
  27.   /* 用以配置MediaPlayer的SurfaceView */
  28.   private SurfaceView mSurfaceView01;
  29.   /* SurfaceHolder对象 */
  30.   private SurfaceHolder mSurfaceHolder01;
  31.   private ImageButton mPlay, mReset, mPause, mStop;
  32.   
  33.   /* 识别MediaPlayer是否已被释放 */
  34.   private boolean bIsReleased = false;
  35.   
  36.   /* 识别MediaPlayer是否正处于暂停 */
  37.   private boolean bIsPaused = false;
  38.   
  39.   /* LogCat输出TAG filter */
  40.   private static final String TAG = "HippoMediaPlayer";
  41.   private String currentFilePath = "";
  42.   private String currentTempFilePath = "";
  43.   private String strVideoURL = "";
  44.   
  45.   /** Called when the activity is first created. */
  46.   @Override
  47.   public void onCreate(Bundle savedInstanceState)
  48.   {
  49.     super.onCreate(savedInstanceState);
  50.     setContentView(R.layout.main);
  51.     
  52.     /* 将.3gp图像文件存放URL网址 */
  53.     strVideoURL =
  54.     "http://www.dubblogs.cc:8751/Android/Test/Media/3gp/test.3gp";
  55.     //http://www.dubblogs.cc:8751/Android/Test/Media/3gp/test2.3gp
  56.     
  57.     mTextView01 = (TextView)findViewById(R.id.myTextView1);
  58.     mEditText01 = (EditText)findViewById(R.id.myEditText1);
  59.     mEditText01.setText(strVideoURL);
  60.     
  61.     /* 绑定Layout上的SurfaceView */
  62.     mSurfaceView01 = (SurfaceView) findViewById(R.id.mSurfaceView1);
  63.     
  64.     /* 设置PixnelFormat */
  65.     getWindow().setFormat(PixelFormat.TRANSPARENT);
  66.     
  67.     /* 设置SurfaceHolder为Layout SurfaceView */
  68.     mSurfaceHolder01 = mSurfaceView01.getHolder();
  69.     mSurfaceHolder01.addCallback(this);
  70.     
  71.     /* 由于原有的影片Size较小,故指定其为固定比例 */
  72.     mSurfaceHolder01.setFixedSize(160, 128);
  73.     mSurfaceHolder01.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  74.     
  75.     mPlay = (ImageButton) findViewById(R.id.play);
  76.     mReset = (ImageButton) findViewById(R.id.reset);
  77.     mPause = (ImageButton) findViewById(R.id.pause);
  78.     mStop = (ImageButton) findViewById(R.id.stop);
  79.     
  80.     /* 播放按钮 */
  81.     mPlay.setOnClickListener(new ImageButton.OnClickListener()
  82.     {
  83.       public void onClick(View view)
  84.       {
  85.         if(checkSDCard())
  86.         {
  87.           strVideoURL = mEditText01.getText().toString();
  88.           playVideo(strVideoURL);
  89.           mTextView01.setText(R.string.str_play);
  90.         }
  91.         else
  92.         {
  93.           mTextView01.setText(R.string.str_err_nosd);
  94.         }
  95.       }
  96.     });
  97.     
  98.     /* 重新播放按钮 */
  99.     mReset.setOnClickListener(new ImageButton.OnClickListener()
  100.     {
  101.       public void onClick(View view)
  102.       {
  103.         if(checkSDCard())
  104.         {
  105.           if(bIsReleased == false)
  106.           {
  107.             if (mMediaPlayer01 != null)
  108.             {
  109.               mMediaPlayer01.seekTo(0);
  110.               mTextView01.setText(R.string.str_play);
  111.             }
  112.           }
  113.         }
  114.         else
  115.         {
  116.           mTextView01.setText(R.string.str_err_nosd);
  117.         }
  118.       }
  119.     });
  120.     
  121.     /* 暂停按钮 */
  122.     mPause.setOnClickListener(new ImageButton.OnClickListener()
  123.     {
  124.       public void onClick(View view)
  125.       {
  126.         if(checkSDCard())
  127.         {
  128.           if (mMediaPlayer01 != null)
  129.           {
  130.             if(bIsReleased == false)
  131.             {
  132.               if(bIsPaused==false)
  133.               {
  134.                 mMediaPlayer01.pause();
  135.                 bIsPaused = true;
  136.                 mTextView01.setText(R.string.str_pause);
  137.               }
  138.               else if(bIsPaused==true)
  139.               {
  140.                 mMediaPlayer01.start();
  141.                 bIsPaused = false;
  142.                 mTextView01.setText(R.string.str_play);
  143.               }
  144.             }
  145.           }
  146.         }
  147.         else
  148.         {
  149.           mTextView01.setText(R.string.str_err_nosd);
  150.         }
  151.       }
  152.     }); 
  153.     
  154.     /* 终止按钮 */
  155.     mStop.setOnClickListener(new ImageButton.OnClickListener()
  156.     {
  157.       public void onClick(View view)
  158.       {
  159.         if(checkSDCard())
  160.         {
  161.           try
  162.           {
  163.             if (mMediaPlayer01 != null)
  164.             {
  165.               if(bIsReleased==false)
  166.               {
  167.                 mMediaPlayer01.seekTo(0);
  168.                 mMediaPlayer01.pause();
  169.                 mTextView01.setText(R.string.str_stop);
  170.               }
  171.             }
  172.           }
  173.           catch(Exception e)
  174.           {
  175.             mTextView01.setText(e.toString());
  176.             Log.e(TAG, e.toString());
  177.             e.printStackTrace();
  178.           }
  179.         }
  180.         else
  181.         {
  182.           mTextView01.setText(R.string.str_err_nosd);
  183.         }
  184.       }
  185.     });
  186.   }
  187.   
  188.   /* 自定义下载URL影片并播放 */ 
  189.   private void playVideo(final String strPath)
  190.   {
  191.     try
  192.     {
  193.       /* 若传入的strPath为现有播放的连接,则直接播放 */
  194.       if (strPath.equals(currentFilePath) && mMediaPlayer01 != null)
  195.       {
  196.         mMediaPlayer01.start();
  197.         return;
  198.       }
  199.       else if(mMediaPlayer01 != null)
  200.       {
  201.         mMediaPlayer01.stop();
  202.       }
  203.       
  204.       currentFilePath = strPath;
  205.       
  206.       /* 重新构建MediaPlayer对象 */
  207.       mMediaPlayer01 = new MediaPlayer();
  208.       /* 设置播放音量 */
  209.       mMediaPlayer01.setAudioStreamType(2);
  210.       
  211.       /* 设置显示于SurfaceHolder */
  212.       mMediaPlayer01.setDisplay(mSurfaceHolder01);
  213.       
  214.       mMediaPlayer01.setOnErrorListener
  215.       (new MediaPlayer.OnErrorListener()
  216.       {
  217.         @Override
  218.         public boolean onError(MediaPlayer mp, int what, int extra)
  219.         {
  220.           // TODO Auto-generated method stub
  221.           Log.i
  222.           (
  223.             TAG,
  224.             "Error on Listener, what: " + what + "extra: " + extra
  225.           );
  226.           return false;
  227.         }
  228.       });
  229.       
  230.       mMediaPlayer01.setOnBufferingUpdateListener
  231.       (new MediaPlayer.OnBufferingUpdateListener()
  232.       {
  233.         @Override
  234.         public void onBufferingUpdate(MediaPlayer mp, int percent)
  235.         {
  236.           // TODO Auto-generated method stub
  237.           Log.i
  238.           (
  239.             TAG, "Update buffer: " + 
  240.             Integer.toString(percent) + "%"
  241.           );
  242.         }
  243.       });
  244.       
  245.       mMediaPlayer01.setOnCompletionListener
  246.       (new MediaPlayer.OnCompletionListener()
  247.       {
  248.         @Override
  249.         public void onCompletion(MediaPlayer mp)
  250.         {
  251.           // TODO Auto-generated method stub
  252.           Log.i(TAG,"mMediaPlayer01 Listener Completed");
  253.           mTextView01.setText(R.string.str_done);
  254.         }
  255.       });
  256.       
  257.       mMediaPlayer01.setOnPreparedListener
  258.       (new MediaPlayer.OnPreparedListener()
  259.       {
  260.         @Override
  261.         public void onPrepared(MediaPlayer mp)
  262.         {
  263.           // TODO Auto-generated method stub
  264.           Log.i(TAG,"Prepared Listener");
  265.         }
  266.       });
  267.       
  268.       Runnable r = new Runnable()
  269.       {
  270.         public void run()
  271.         {
  272.           try
  273.           {
  274.             /* 在线程运行中,调用自定义函数抓下文件 */
  275.             setDataSource(strPath);
  276.             /* 下载完后才会调用prepare */
  277.             mMediaPlayer01.prepare();
  278.             Log.i
  279.             (
  280.               TAG, "Duration: " + mMediaPlayer01.getDuration()
  281.             );
  282.             mMediaPlayer01.start();
  283.             bIsReleased = false;
  284.           }
  285.           catch (Exception e)
  286.           {
  287.             Log.e(TAG, e.getMessage(), e);
  288.           }
  289.         } 
  290.       };
  291.       new Thread(r).start();
  292.     }
  293.     catch(Exception e)
  294.     {
  295.       if (mMediaPlayer01 != null)
  296.       {
  297.         mMediaPlayer01.stop();
  298.         mMediaPlayer01.release();
  299.       }
  300.     }
  301.   }
  302.   
  303.   /* 自定义setDataSource,由线程启动 */
  304.   private void setDataSource(String strPath) throws Exception
  305.   {
  306.     if (!URLUtil.isNetworkUrl(strPath))
  307.     {
  308.       mMediaPlayer01.setDataSource(strPath);
  309.     }
  310.     else
  311.     {
  312.       if(bIsReleased == false)
  313.       {
  314.         URL myURL = new URL(strPath);
  315.         URLConnection conn = myURL.openConnection();
  316.         conn.connect();
  317.         InputStream is = conn.getInputStream();
  318.         if (is == null)
  319.         {
  320.           throw new RuntimeException("stream is null");
  321.         }
  322.         File myFileTemp = File.createTempFile
  323.         ("hippoplayertmp", "."+getFileExtension(strPath));
  324.         
  325.         currentTempFilePath = myFileTemp.getAbsolutePath();
  326.         
  327.         /*currentTempFilePath = /sdcard/mediaplayertmp39327.dat */
  328.         
  329.         FileOutputStream fos = new FileOutputStream(myFileTemp);
  330.         byte buf[] = new byte[128];
  331.         do
  332.         {
  333.           int numread = is.read(buf);
  334.           if (numread <= 0)
  335.           {
  336.             break;
  337.           }
  338.           fos.write(buf, 0, numread);
  339.         }while (true);
  340.         mMediaPlayer01.setDataSource(currentTempFilePath);
  341.         try
  342.         {
  343.           is.close();
  344.         }
  345.         catch (Exception ex)
  346.         {
  347.           Log.e(TAG, "error: " + ex.getMessage(), ex);
  348.         }
  349.       }
  350.     }
  351.   }
  352.   
  353.   private String getFileExtension(String strFileName)
  354.   {
  355.     File myFile = new File(strFileName);
  356.     String strFileExtension=myFile.getName();
  357.     strFileExtension=(strFileExtension.substring
  358.     (strFileExtension.lastIndexOf(".")+1)).toLowerCase();
  359.     
  360.     if(strFileExtension=="")
  361.     {
  362.       /* 若无法顺利取得扩展名,默认为.dat */
  363.       strFileExtension = "dat";
  364.     }
  365.     return strFileExtension;
  366.   }
  367.   
  368.   private boolean checkSDCard()
  369.   {
  370.     /* 判断存储卡是否存在 */
  371.     if(android.os.Environment.getExternalStorageState().equals
  372.     (android.os.Environment.MEDIA_MOUNTED))
  373.     {
  374.       return true;
  375.     }
  376.     else
  377.     {
  378.       return false;
  379.     }
  380.   }
  381.   
  382.   @Override 
  383.   public void surfaceChanged
  384.   (SurfaceHolder surfaceholder, int format, int w, int h)
  385.   {
  386.     // TODO Auto-generated method stub
  387.     Log.i(TAG, "Surface Changed");
  388.   }
  389.   
  390.   @Override
  391.   public void surfaceCreated(SurfaceHolder surfaceholder)
  392.   {
  393.     // TODO Auto-generated method stub
  394.     Log.i(TAG, "Surface Changed");
  395.   }
  396.   
  397.   @Override
  398.   public void surfaceDestroyed(SurfaceHolder surfaceholder)
  399.   {
  400.     // TODO Auto-generated method stub
  401.     Log.i(TAG, "Surface Changed");
  402.   }
  403. }