Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android學習筆記045之MediaPlayer

Android學習筆記045之MediaPlayer

編輯:關於Android編程

這一篇我們介紹一下Android的音頻和視頻播放,重點講解Mediaplayer這個類。 Android的MediaPlayer包含了Audio和Video的播放功能,在Android的界面上,Music和Video兩個應用程序都是調用MediaPlaer來實現的。

概述

首先我們看一下Mediaplayer的生命周期圖

\

下面我們看一下MediaPlayer提供的方法:

addTimedTextSource(Context context, Uri uri, String mimeType)方法:添加一個外部定時文本文件,重載方法:addTimedTextSource(String path, String mimeType)、addTimedTextSource(FileDescriptor fd, long offset, long length, String mime)、addTimedTextSource(FileDescriptor fd, String mimeType) attachAuxEffect(int effectId)方法:給播放器附加一個播放效果 create(Context context, Uri uri, SurfaceHolder holder, AudioAttributes audioAttributes, int audioSessionId)方法:實例化Mediaplayer的方法,重載方法有:create(Context context, Uri uri, SurfaceHolder holder)、create(Context context, int resid, AudioAttributes audioAttributes, int audioSessionId)、create(Context context, int resid)、create(Context context, Uri uri) deselectTrack(int index)方法:取消曲目 getAudioSessionId()方法:獲取音樂的SessionID getCurrentPosition()方法:獲取當前播放位置 getDuration()方法:獲取文件的播放時間 getPlaybackParams()方法:獲取播放參數 getSelectedTrack(int trackType)方法:獲取選中的曲目 getSyncParams()方法:獲取Audio或者Vedio的同步模式 getTimestamp()方法:獲取當前的播放位置作為一個時間戳 getTrackInfo()方法:獲取軌道信息數組 getVideoHeight()方法:獲取Vedio播放器的高度 getVideoWidth()方法:獲取Vedio播放器的寬度 isLoZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcGluZygpt723qKO6vOyy6bKlt8XG98rHt/HU2tGtu7cgaXNQbGF5aW5nKCm3vbeoo7q87LLpsqW3xcb3yse38dTasqW3xSBwYXVzZSgpt723qKO61N3NoyBwcmVwYXJlKCm3vbeoo7rXvLG4sqW3xcb3vfjQ0LKlt8UgcHJlcGFyZUFzeW5jKCmjutLssr3XvLG4sqW3xcb3IHJlbGVhc2UoKbe9t6ijusrNt8XT67Wxx7BNZWRpYXBsYXllcs/gudi1xNfK1LQgcmVzZXQoKbe9t6ijutbY1sOypbfFxvfXtMysIHNlZWtUbyhpbnQgbXNlYym3vbeoo7rM+Neqtb3M2LaoyrG85M671sMgc2VsZWN0VHJhY2soaW50IGluZGV4Kbe9t6ijutGh1tDSu7j2x/rEvyBzZXRBdWRpb0F0dHJpYnV0ZXMoQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpt723qKO6yejWw9L0xrWypbfFxve1xMr00NQgc2V0QXVkaW9TZXNzaW9uSWQoaW50IHNlc3Npb25JZCm3vbeoo7rJ6NbD0vTGtbKlt8XG97XEU2Vzc2lvbklkIHNldEF1ZGlvU3RyZWFtVHlwZShpbnQgc3RyZWFtdHlwZSm3vbeoo7rJ6NbDTWVkaWFwbGF5ZXK1xNL0xrXB98Dg0M0gc2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKbe9t6ijusno1sOypbfFxve1xLXatv6158a9uL2809f308Mgc2V0RGF0YVNvdXJjZShTdHJpbmcgcGF0aCm3vbeoo7rJ6NbDtuDDvczl18rUtM671sOjrNbY1Ni3vbeo09CjunNldERhdGFTb3VyY2UoQ29udGV4dCBjb250ZXh0LCBVcmkgdXJpLCBNYXANCjxoMiBpZD0="音頻播放">音頻播放

使用Mediaplayer實現音頻播放有幾個步驟:

創建Mediaplayer對象,這有幾種方法,一種是直接new出來,另外一種是通過調用create方法,需要注意的是:直接new出來需要調用prepare方法,建議使用prepareAsync方法完成准備;調用create方法就不能調用prepare方法,否則會出現狀態異常

通過setDataSource()方法設置音頻文件的路徑,當然這裡只是很簡單的,實際開發中會采取其他方法

3.調用start方法開始播放音頻

下面我們通過一個小例子實現音頻播放

首先是布局文件代碼:





這裡沒有什麼好介紹的,非常簡單的一個布局。

接下來是Activity的代碼:

package com.example.mediplayerdemo;

import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;

/**
 * Created by Huawen on 2016/9/5.
 */
public class MusicActivity extends AppCompatActivity {
private static final String TAG = "MusicActivity";
private Button btn_music_play;
private Button btn_music_stop;
private Button btn_music_resume;

private SeekBar mSeekBar;
private TextView tv_now_time;
private TextView tv_total_time;

private MediaPlayer mMediaPlayer;

private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
    }
};
private boolean isDstroy = false;

private Runnable mRunable = new Runnable() {
    @Override
    public void run() {
        if (!isDstroy) {
            mHandler.postDelayed(this, 1000);
            int currentTime = Math.round(mMediaPlayer.getCurrentPosition() / 1000);
            String currentStr = String.format("%s%02d:%02d", "當前時間 ", currentTime / 60, currentTime % 60);
            tv_now_time.setText(currentStr);
            mSeekBar.setProgress(mMediaPlayer.getCurrentPosition());
        }
    }
};

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_music);
    initView();
    initMediaPlayer();
}

private void initMediaPlayer() {
    mMediaPlayer = MediaPlayer.create(this, R.raw.erathemass);
    Log.d(TAG, "初始化播放器");
}

private void initView() {
    btn_music_play = (Button) findViewById(R.id.btn_music_play);
    btn_music_stop = (Button) findViewById(R.id.btn_music_stop);
    btn_music_resume = (Button) findViewById(R.id.btn_music_resume);

    mSeekBar = (SeekBar) findViewById(R.id.seekbar);
    tv_now_time = (TextView) findViewById(R.id.tv_now_time);
    tv_total_time = (TextView) findViewById(R.id.tv_total_time);

    mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            if (mMediaPlayer != null) {
                mMediaPlayer.seekTo(seekBar.getProgress());
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

    btn_music_play.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!mMediaPlayer.isPlaying()) {
                mMediaPlayer.start();
                int totalTime = Math.round(mMediaPlayer.getDuration() / 1000);
                String totalStr = String.format("%02d:%02d", totalTime / 60, totalTime % 60);
                tv_total_time.setText(totalStr);
                mHandler.postDelayed(mRunable, 1000);
                mSeekBar.setMax(mMediaPlayer.getDuration());
            }
        }
    });
    btn_music_resume.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mMediaPlayer.isPlaying()) {
                mMediaPlayer.pause();
            }
        }
    });
    btn_music_stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mMediaPlayer.isPlaying()) {
                mMediaPlayer.reset();
                initMediaPlayer();
            }

        }
    });
}


public static void startActivity(Context mContext) {
    mContext.startActivity(new Intent(mContext, MusicActivity.class));
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mMediaPlayer != null) {
        mMediaPlayer.stop();
        isDstroy = true;
        mMediaPlayer.release();
    }
}
}

這裡只是很簡單的實現單首歌曲的播放,就不貼效果圖了,後面我們會專門做一個音樂播放器的項目。

視頻播放

這裡我們使用VideoView實現網絡視頻播放,實現的步驟:

在布局文件中創建VideoView組件,或者在代碼中指定

調用VedioView的兩個方法指定播放的視頻文件:(1)setVidePath(String path):加載path文件代表的視頻;(2)setVideoURI(Uri uri):加載uri所對應的視頻

調用VideoView的start()、stop()、pause()方法來控制視頻的播放

下面我們實現一個簡單的例子:

首先是布局文件






然後是activity代碼:

package com.example.mediplayerdemo;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.VideoView;


/**
 * author: Huawen
 * created on: 2016/9/5 11:00
 * description:
 */
public class MovieActivity extends AppCompatActivity {
private VideoView videoView;
private Button btn_video_start;
private Button btn_video_pause;
private Button btn_video_stop;
private Uri mURI = Uri.parse("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_movie);
    videoView = (VideoView) findViewById(R.id.videoView);
    btn_video_start = (Button) findViewById(R.id.btn_video_start);
    btn_video_pause = (Button) findViewById(R.id.btn_video_pause);
    btn_video_stop = (Button) findViewById(R.id.btn_video_stop);


    videoView.setVideoURI(mURI);
    btn_video_start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (videoView != null) {
                videoView.start();
            }
        }
    });
    btn_video_pause.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (videoView != null) {
                videoView.pause();
            }
        }
    });
    btn_video_stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (videoView != null) {
                videoView.stopPlayback();
            }
        }
    });
}


public static void startActivity(Context mContext) {
    mContext.startActivity(new Intent(mContext, MovieActivity.class));
}


}

這裡我們是手動控制播放,也可以直接設置一個MediaController控制,不需要我們手動去控制實現播放

效果圖:

\

由於是在模擬器上,所以比較慢,就不做GIF圖了。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved