編輯:關於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圖了。
ES文件浏覽器怎麼開啟保護跟打開網絡保護。ES文件浏覽器很強大的一個軟件。有時我們防止別人進入手機文件,偷看我們的文件的時候,我們設置對ES文件浏覽器開啟保
Frame動畫就像是gif圖,通過一些靜態圖片來達到動畫的效果。 Android sdk中的AnimationDrawable就是專門針對Frame動畫,當然Frame動
https://github.com/daimajia/AndroidViewHover import android.support.v8.renderscrip
Android開發中少不了真機調試,總用數據線插插拔拔的還是不方便也不穩定,其實可以實現WIFI的方式連接android手機。 &nbs