Android提高第一篇之MediaPlayer

來源:互聯網
上載者:User

本文來自http://blog.csdn.net/hellogv/ ,引用必須註明出處! 

        前面寫了十四篇關於介面的入門文章,大家都看完和跟著練習之後,對於常用的Layout和View都會有一定的瞭解了,接下來的文章就不再強調介紹介面了,而是針對具體的常見功能而展開。

        本文介紹MediaPlayer的使用。MediaPlayer可以播放音頻和視頻,另外也可以通過VideoView來播放視頻,雖然VideoView比MediaPlayer簡單易用,但定製性不如用MediaPlayer,要視情況選擇了。MediaPlayer播放音頻比較簡單,但是要播放視頻就需要SurfaceView。SurfaceView比普通的自訂View更有繪圖上的優勢,它支援完全的OpenGL ES庫。

         先貼出本文程式運行結果的,上面是播放/停止音頻,可用SeekBar來調進度,下面是播放/停止視頻,也是用SeekBar來調進度:

 

main.xml的源碼:

<?xml version="1.0" encoding="utf-8"?><br /><LinearLayout android:id="@+id/LinearLayout01"<br />android:layout_width="fill_parent" android:layout_height="fill_parent"<br />xmlns:android="http://schemas.android.com/apk/res/android"<br />android:orientation="vertical"><br /><SeekBar android:id="@+id/SeekBar01" android:layout_height="wrap_content"<br />android:layout_width="fill_parent"></SeekBar><br /><LinearLayout android:id="@+id/LinearLayout02"<br />android:layout_width="wrap_content" android:layout_height="wrap_content"><br /><Button android:id="@+id/Button01" android:layout_width="wrap_content"<br />android:layout_height="wrap_content" android:text="播放音頻"></Button><br /><Button android:id="@+id/Button02" android:layout_width="wrap_content"<br />android:layout_height="wrap_content" android:text="停止播放"></Button><br /></LinearLayout><br /><SeekBar android:id="@+id/SeekBar02" android:layout_height="wrap_content"<br />android:layout_width="fill_parent"></SeekBar></p><p><SurfaceView android:id="@+id/SurfaceView01"<br />android:layout_width="fill_parent" android:layout_height="250px"></SurfaceView><br /><LinearLayout android:id="@+id/LinearLayout02"<br />android:layout_width="wrap_content" android:layout_height="wrap_content"><br /><Button android:layout_width="wrap_content"<br />android:layout_height="wrap_content" android:id="@+id/Button03"<br />android:text="播放視頻"></Button><br /><Button android:layout_width="wrap_content"<br />android:layout_height="wrap_content" android:text="停止播放" android:id="@+id/Button04"></Button><br /></LinearLayout><br /></LinearLayout><br />

 

本文程式的源碼,有點長:

package com.testMedia;</p><p>import java.io.IOException;<br />import java.util.Timer;<br />import java.util.TimerTask;<br />import android.app.Activity;<br />import android.media.AudioManager;<br />import android.media.MediaPlayer;<br />import android.os.Bundle;<br />import android.view.SurfaceHolder;<br />import android.view.SurfaceView;<br />import android.view.View;<br />import android.widget.Button;<br />import android.widget.SeekBar;<br />import android.widget.Toast; </p><p>public class testMedia extends Activity {<br /> /** Called when the activity is first created. */ </p><p>private SeekBar skb_audio=null;<br /> private Button btn_start_audio = null;<br /> private Button btn_stop_audio = null;</p><p> private SeekBar skb_video=null;<br /> private Button btn_start_video = null;<br /> private Button btn_stop_video = null;<br /> private SurfaceView surfaceView;<br /> private SurfaceHolder surfaceHolder; </p><p> private MediaPlayer m = null;<br /> private Timer mTimer;<br /> private TimerTask mTimerTask;</p><p> private boolean isChanging=false;//互斥變數,防止定時器與SeekBar拖動時進度衝突<br /> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main); </p><p> //----------Media控制項設定---------//<br /> m=new MediaPlayer();</p><p> //播放結束之後彈出提示<br /> m.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){<br />@Override<br />public void onCompletion(MediaPlayer arg0) {<br />Toast.makeText(testMedia.this, "結束", 1000).show();<br />m.release();<br />}<br /> });</p><p> //----------定時器記錄播放進度---------//<br /> mTimer = new Timer();<br /> mTimerTask = new TimerTask() {<br /> @Override<br /> public void run() {<br /> if(isChanging==true)<br /> return;</p><p> if(m.getVideoHeight()==0)<br /> skb_audio.setProgress(m.getCurrentPosition());<br /> else<br /> skb_video.setProgress(m.getCurrentPosition());<br /> }<br /> };</p><p> mTimer.schedule(mTimerTask, 0, 10);</p><p> btn_start_audio = (Button) this.findViewById(R.id.Button01);<br /> btn_stop_audio = (Button) this.findViewById(R.id.Button02);<br /> btn_start_audio.setOnClickListener(new ClickEvent());<br /> btn_stop_audio.setOnClickListener(new ClickEvent());<br /> skb_audio=(SeekBar)this.findViewById(R.id.SeekBar01);<br /> skb_audio.setOnSeekBarChangeListener(new SeekBarChangeEvent());</p><p> btn_start_video = (Button) this.findViewById(R.id.Button03);<br /> btn_stop_video = (Button) this.findViewById(R.id.Button04);<br /> btn_start_video.setOnClickListener(new ClickEvent());<br /> btn_stop_video.setOnClickListener(new ClickEvent());<br /> skb_video=(SeekBar)this.findViewById(R.id.SeekBar02);<br /> skb_video.setOnSeekBarChangeListener(new SeekBarChangeEvent());<br /> surfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);<br /> surfaceHolder = surfaceView.getHolder();<br /> surfaceHolder.setFixedSize(100, 100);<br /> surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);<br /> } </p><p> /*<br /> * 按鍵事件處理<br /> */<br /> class ClickEvent implements View.OnClickListener{<br />@Override<br />public void onClick(View v) {<br />if(v==btn_start_audio)<br />{<br />m.reset();//恢複到未初始化的狀態<br />m=MediaPlayer.create(testMedia.this, R.raw.big);//讀取音頻<br />skb_audio.setMax(m.getDuration());//設定SeekBar的長度<br />try {<br />m.prepare();//準備<br />} catch (IllegalStateException e) {<br />// TODO Auto-generated catch block<br />e.printStackTrace();<br />} catch (IOException e) {<br />// TODO Auto-generated catch block<br />e.printStackTrace();<br />}<br />m.start();//播放<br />}<br />else if(v==btn_stop_audio || v==btn_stop_video)<br />{<br />m.stop();<br />}<br />else if(v==btn_start_video)<br />{<br />m.reset();//恢複到未初始化的狀態<br />m=MediaPlayer.create(testMedia.this, R.raw.test);//讀取視頻<br />skb_video.setMax(m.getDuration());//設定SeekBar的長度<br />m.setAudioStreamType(AudioManager.STREAM_MUSIC);<br />m.setDisplay(surfaceHolder);//設定螢幕</p><p>try {<br /> m.prepare();</p><p>} catch (IllegalArgumentException e) {<br />// TODO Auto-generated catch block<br />e.printStackTrace();<br />} catch (IllegalStateException e) {<br />// TODO Auto-generated catch block<br />e.printStackTrace();<br />} catch (IOException e) {<br />// TODO Auto-generated catch block<br />e.printStackTrace();<br />}<br />m.start();<br />}<br />}<br /> }</p><p> /*<br /> * SeekBar進度改變事件<br /> */<br /> class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener{</p><p>@Override<br />public void onProgressChanged(SeekBar seekBar, int progress,<br />boolean fromUser) {<br />// TODO Auto-generated method stub</p><p>}</p><p>@Override<br />public void onStartTrackingTouch(SeekBar seekBar) {<br /> isChanging=true;<br />}</p><p>@Override<br />public void onStopTrackingTouch(SeekBar seekBar) {<br />m.seekTo(seekBar.getProgress());<br /> isChanging=false;<br />}</p><p> }</p><p>}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.