Android MediaPlayer的基本使用

MediaPlayer是Android中播放視頻最簡單的控件,這篇文章將介紹MediaPlaer播放視頻的基本方法,在后續(xù)文章中將分析MediaPlayer的原理娶耍。

MediaPlayer的創(chuàng)建有兩種方法,一種是new MediaPlayer臼寄,另一種是MediaPlayer.create伪朽,兩種方法都將返回MediaPlayer的實例對象,需要注意的是使用MediaPlayer.create創(chuàng)建實例對象的時候\color{red}{如果創(chuàng)建失敗將返回空铭乾,這點需要注意剪廉。}如果使用new MediaPlayer創(chuàng)建對象,則需要調(diào)用setDataSource()方法來設(shè)置播放源炕檩,下面我們來看看MediaPlayer的常用方法斗蒋。

常用方法

  • void start():開始或恢復(fù)播放。

  • void stop():停止播放笛质。

  • void pause():暫停播放泉沾。

  • int getDuration():獲取流媒體的總播放時長,單位是毫秒妇押。

  • int getCurrentPosition():獲取當(dāng)前流媒體的播放的位置跷究,單位是毫秒。

  • void seekTo(int msec):設(shè)置當(dāng)前MediaPlayer的播放位置舆吮,單位是毫秒揭朝。

  • void setLooping(boolean looping):設(shè)置是否循環(huán)播放。

  • boolean isLooping():判斷是否循環(huán)播放色冀。

  • boolean isPlaying():判斷是否正在播放潭袱。

  • void prepare():同步的方式裝載流媒體文件。

  • void prepareAsync():異步的方式裝載流媒體文件锋恬。

  • void release ():回收流媒體資源屯换。

  • void setAudioStreamType(int streamtype):設(shè)置播放流媒體類型。

  • void setWakeMode(Context context, int mode):設(shè)置CPU喚醒的狀態(tài)。

  • setNextMediaPlayer(MediaPlayer next):設(shè)置當(dāng)前流媒體播放完畢彤悔,下一個播放的MediaPlayer嘉抓。

下面是基本使用流程代碼

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button mStart;
    private Button mPause;
    private Button mStop;
    private SurfaceView mVideoView;
    private MediaPlayer mMediaPlayer;
    private boolean isPause;
    private boolean isStop = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initMediaController();
    }

    private void initMediaController() {
        SurfaceHolder holder = mVideoView.getHolder();
        holder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                initMediaPlayer(holder);
            }

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

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

            }
        });

    }

    private void initMediaPlayer(SurfaceHolder holder) {
        mMediaPlayer = new MediaPlayer();
        String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "aa.mp4";
        try {
            mMediaPlayer.setDataSource(path);
        } catch (IOException e) {
            e.printStackTrace();
        }
        mMediaPlayer.setDisplay(holder);
        try {
            mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mp.setLooping(true);
                    isStop = false;
                    int duration = mp.getDuration();
                    Toast.makeText(MainActivity.this, "" + duration, Toast.LENGTH_SHORT).show();
                }
            });
            mMediaPlayer.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void initView() {
        mStart = findViewById(R.id.bt_start);
        mPause = findViewById(R.id.bt_pause);
        mStop = findViewById(R.id.bt_stop);
        mVideoView = findViewById(R.id.sv_video);
        mStart.setOnClickListener(this);
        mPause.setOnClickListener(this);
        mStop.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_start:
                if (isStop) {
                    try {
                        mMediaPlayer.prepare();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                mMediaPlayer.start();
                break;
            case R.id.bt_pause:
                if (isPause) {
                    mMediaPlayer.start();
                    mPause.setText("暫停");
                    isPause = false;
                } else {
                    mMediaPlayer.pause();
                    mPause.setText("繼續(xù)");
                    isPause = true;
                }
                break;
            case R.id.bt_stop:
                mMediaPlayer.stop();
                isStop = true;
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mMediaPlayer.isPlaying()) {
            mMediaPlayer.stop();
        }
        mMediaPlayer.release();
    }
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/bt_start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="開始"
        />
    <Button
        android:id="@+id/bt_pause"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="暫停"
        />
    <Button
        android:id="@+id/bt_stop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="停止"
        />
    
    <SurfaceView
        android:id="@+id/sv_video"
        android:layout_gravity="center_horizontal"
        android:layout_width="320dp"
        android:layout_height="160dp"/>
</LinearLayout>

效果圖

界面截圖

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市晕窑,隨后出現(xiàn)的幾起案子抑片,更是在濱河造成了極大的恐慌,老刑警劉巖杨赤,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敞斋,死亡現(xiàn)場離奇詭異,居然都是意外死亡疾牲,警方通過查閱死者的電腦和手機(jī)植捎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阳柔,“玉大人焰枢,你說我怎么就攤上這事∩嗉粒” “怎么了济锄?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長架诞。 經(jīng)常有香客問我拟淮,道長,這世上最難降的妖魔是什么谴忧? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任很泊,我火速辦了婚禮,結(jié)果婚禮上沾谓,老公的妹妹穿的比我還像新娘委造。我一直安慰自己,他們只是感情好均驶,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布昏兆。 她就那樣靜靜地躺著,像睡著了一般妇穴。 火紅的嫁衣襯著肌膚如雪爬虱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天腾它,我揣著相機(jī)與錄音跑筝,去河邊找鬼。 笑死瞒滴,一個胖子當(dāng)著我的面吹牛曲梗,可吹牛的內(nèi)容都是我干的赞警。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼虏两,長吁一口氣:“原來是場噩夢啊……” “哼愧旦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起定罢,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤笤虫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后祖凫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耕皮,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年蝙场,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粱年。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡售滤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出台诗,到底是詐尸還是另有隱情完箩,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布拉队,位于F島的核電站弊知,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粱快。R本人自食惡果不足惜秩彤,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望事哭。 院中可真熱鬧漫雷,春花似錦、人聲如沸鳍咱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谤辜。三九已至蓄坏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丑念,已是汗流浹背涡戳。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留渠欺,地道東北人妹蔽。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胳岂。 傳聞我的和親對象是個殘疾皇子编整,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1、MediaPlayer的生命周期 有兩種類型的弧乳丰,單箭頭表示的是同步方法調(diào)用掌测,有兩個箭頭代表異步方法調(diào)用 1、...
    i冰點閱讀 5,103評論 0 7
  • Android的多媒體框架支持各種常見的多媒體類型产园,這樣在程序中可以很容易地集成音頻汞斧、視頻或者圖片。Android...
    _Ryan閱讀 61,399評論 13 54
  • by吳思博20180131 一什燕、MediaPlayer詳解 二粘勒、常用方法 1、使用進(jìn)度條: 2屎即、prepare方法...
    吳小博Toby閱讀 9,022評論 0 16
  • 一庙睡、流媒體 什么是流媒體技術(shù)?簡單的說,就是邊下載技俐,邊播放乘陪。也就是說,客戶端在播放前雕擂,無需下載整個媒體文件啡邑,而是在...
    szy啊閱讀 16,077評論 2 23
  • 本人初學(xué)Android,最近做了一個實現(xiàn)安卓簡單音樂播放功能的播放器井赌,收獲不少谤逼,于是便記錄下來自己的思路與知識總結(jié)...
    落日柳風(fēng)閱讀 19,133評論 2 41