Android開發05_MediaPlayer之音頻播放


一、前言

MediaPlayer類是Android API中專門針對媒體資源的使用開發的一個類,其中包含音頻資源和視頻資源,使用起來也較簡單。


二、音頻資源的使用

1、初始化MediaPlayer,有兩種方式可以初始化MediaPlayer,直接new或者用靜態方法create

// # 1 直接new
mp = new MediaPlayer();
// # 2 使用靜態方法創建
mp = MediaPlayer.create(this,R.raw.a);

2、設置音頻資源:此方法可傳本地資源路徑,也可傳網絡音頻網址

mp.setDataSource(musicVo.getPath());

3、准備資源狀態:若准備本地資源,可直接使用prepare()方法,若准備網絡資源可使用prepareAsync(),另外要准備網絡資源要結合准備監聽同步使用

// # 1 本地資源的准備
mp.prepare();
// # 2 網絡資源的准備
mp.prepareAsync();

4、一旦資源准備完畢,就可以使用MediaPlayer這個強大的類來播放音頻資源了

mp.start();

三、MediaPlayer常用屬性及方法

1、可使用MediaPlayer對象獲取音頻資源長度,以及獲取音頻資源播放的當前長度

mp.getDuration();//總時長
mp.getCurrentPosition();//當前位置

2、可使用MediaPlayer對象將播放資源直接跳到指定位置

//跳到指定位置播放
mp.seekTo(80);

  3、強大的reset,每次播放新的音頻資源時,可使用reset將播放器對象重置,清除之前的所有內容

mp.reset();

4、四種監聽,都比較容易理解和使用

// #  設置監聽(非必需)
mp.setOnCompletionListener(this);//完成監聽
mp.setOnErrorListener(this);//錯誤監聽
mp.setOnPreparedListener(this);//准備好的監聽
mp.setOnBufferingUpdateListener(this);//緩沖監聽

四、獲取專輯封面

1、若獲取本地已經存在的歌曲專輯封面,可通過ContentProvider獲取指定的歌曲的封面圖片,以下是獲取歌曲封面的工具類

package com.projectb.mediaplayer;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.ParcelFileDescriptor;

import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

/**
* Created by macbook on 2016/11/20.
*/

public class MusicGetPic {

public static Bitmap getArtwork(Context context, long song_id, long album_id, boolean allowdefault) {
if (album_id < 0) {
// This is something that is not in the database, so get the album art directly
// from the file.
if (song_id >= 0) {
Bitmap bm = getArtworkFromFile(context, song_id, -1);
if (bm != null) {
return bm;
}
}
if (allowdefault) {
return getDefaultArtwork(context);
}
return null;
}
ContentResolver res = context.getContentResolver();
Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id);
if (uri != null) {
InputStream in = null;
try {
in = res.openInputStream(uri);
return BitmapFactory.decodeStream(in, null, sBitmapOptions);
} catch (FileNotFoundException ex) {
// The album art thumbnail does not actually exist. Maybe the user deleted it, or
// maybe it never existed to begin with.
Bitmap bm = getArtworkFromFile(context, song_id, album_id);
if (bm != null) {
if (bm.getConfig() == null) {
bm = bm.copy(Bitmap.Config.RGB_565, false);
if (bm == null && allowdefault) {
return getDefaultArtwork(context);
}
}
} else if (allowdefault) {
bm = getDefaultArtwork(context);
}
return bm;
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {
}
}
}

return null;
}

private static Bitmap getArtworkFromFile(Context context, long songid, long albumid) {
Bitmap bm = null;
byte[] art = null;
String path = null;
if (albumid < 0 && songid < 0) {
throw new IllegalArgumentException("Must specify an album or a song id");
}
try {
if (albumid < 0) {
Uri uri = Uri.parse("content://media/external/audio/media/" + songid + "/albumart");
ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");
if (pfd != null) {
FileDescriptor fd = pfd.getFileDescriptor();
bm = BitmapFactory.decodeFileDescriptor(fd);
}
} else {
Uri uri = ContentUris.withAppendedId(sArtworkUri, albumid);
ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");
if (pfd != null) {
FileDescriptor fd = pfd.getFileDescriptor();
bm = BitmapFactory.decodeFileDescriptor(fd);
}
}
} catch (FileNotFoundException ex) {

}
if (bm != null) {
mCachedBit = bm;
}
return bm;
}

private static Bitmap getDefaultArtwork(Context context) {

Drawable drawable = context.getResources().getDrawable(R.drawable.pic_ax);
BitmapDrawable bd = (BitmapDrawable) drawable;
Bitmap bitmap = bd.getBitmap();

return bitmap;
}

private static final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
private static final BitmapFactory.Options sBitmapOptions = new BitmapFactory.Options();
private static Bitmap mCachedBit = null;
}

2、若播放網絡端的圖片,需要對應的接口才可以獲取音頻的圖片,本地能從ContentProvider中獲取,是因為你在下載歌曲的時候就已經把專輯圖片一起下載下來了,所以可以獲取

3、項目源碼:https://github.com/Knight2016/MediaPlayer-



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: