MediaPlayer音乐播放器的基本实现

18.1MediaPlayer使用

18.1.1MediaPlayer基本使用

18.1.2MediaPlayer注意事项

18.2播放器UI搭建

18.2.1 开始,暂停

18.2.2 上一首,下一首

18.3网络音乐资源获取

18.3.1 请求网络音乐资源

18.3.2 解析网络音乐资源

18.3.3 加载网络音乐资源

18.4实现后台播放

18.4.1 实现单首音乐后台播放

18.4.2 实现上一首下一首音乐播放

18.4.3 实现音乐的播放与暂停

MediaPlayer常用的方法:

void setDataSource(String path) :通过一个具体的路径来设置MediaPlayer的数据源,path可以是本地的一个路径,也可以是一个网络路径

int getCurrentPosition() 获取当前播放的位置

int getAudioSessionId() 返回音频的session ID

int getDuration() 得到文件的时间

boolean isLooping () 是否循环播放

boolean isPlaying() 是否正在播放

void pause () 暂停

void start () 开始

void stop () 停止

void prepare() 同步的方式装载流媒体文件。

void prepareAsync() 异步的方式装载流媒体文件。

void reset() 重置MediaPlayer至未初始化状态。

void release () 回收流媒体资源。

void seekTo(int msec) 指定播放的位置(以毫秒为单位的时间)

void setLooping(boolean looping) 设置是否单曲循环

setOnCompletionListener(MediaPlayer.OnCompletionListenerlistener) 网络流媒体播放结束时回调

setOnErrorListener(MediaPlayer.OnErrorListenerlistener) 发生错误时回调 **

setOnPreparedListener(MediaPlayer.OnPreparedListenerlistener):当装载流媒体完毕的时候回调。

注意:reset方法是将数据清空。 release方法是将媒体对象回收掉

使用完MediaPlayer需要回收资源。MediaPlayer是很消耗系统资源的,所以在使用完MediaPlayer,不要等待系统自动回收,最好是主动回收资源。

if (mediaPlayer != null &&mediaPlayer.isPlaying()) {

mediaPlayer.stop();

mediaPlayer.release();

mediaPlayer = null;

}

对于单曲循环之类的操作,除了可以使用setLooping()方法进行设置之外,还可以为MediaPlayer注册回调函数,MediaPlayer.setOnCompletionListener(),它会在MediaPlayer播放完毕被回调。

// 设置循环播放

mediaPlayer.setLooping(true);

mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

@Override

public voidonCompletion(MediaPlayer mp) {

// 在播放完毕被回调

play();

}

});

在Activity中主动获取权限:

在安卓6.0以后除了需要在manifest文件中注册各权限外,还需要在代码中动态调用安卓API申请权限。

public class MainActivity extends AppCompatActivity {

private ContentResolver contentResolver;

private ListView listView;

ImageView play_iv,forword_iv,rewind_iv,mode_iv;

SeekBar seekBar;

TextView cur_tv,dur_tv;

Timer timer;

Handler handler=new Handler();

@RequiresApi(api = Build.VERSION_CODES.M)

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initview();

requestPermissions(new String[]{

Manifest.permission.WRITE_EXTERNAL_STORAGE,

Manifest.permission.READ_EXTERNAL_STORAGE,

Manifest.permission.READ_CONTACTS,

Manifest.permission.WRITE_CONTACTS,

Manifest.permission.READ_SMS,

Manifest.permission.CALL_PHONE,

Manifest.permission.ACCESS_NETWORK_STATE,

Manifest.permission.READ_PHONE_STATE,

Manifest.permission.WRITE_CALL_LOG,

Manifest.permission.READ_CALL_LOG

}, 991);

contentResolver = getContentResolver();

Cursor cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);

if (cursor != null) {

while (cursor.moveToNext()) {

String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));

String data = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));

String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));

String size = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));

String duration = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));

String album_id = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));

Log.i("---title", "onCreate:" + title);

if (Integer.parseInt(duration) > 5000) {

Uri uri = Uri.parse("content://media/external/audio/albums/" + album_id);

Cursor cursor1 = contentResolver.query(uri, null, null, null, null, null);

while (cursor1.moveToNext()) {

String album_art = cursor1.getString(cursor1.getColumnIndexOrThrow("album_art"));

Log.i("----bbb", "onCreate: " + album_art);

int d = Integer.parseInt(duration);

String time = d / 1000 / 60 + ":" + d / 1000 % 60;

Muisc muisc = new Muisc(title, data, time, size, artist, album_art);

//初始化数据源

MusicManger.getInstance().muiscList.add(muisc);

for (int i = 0; i < MusicManger.getInstance().muiscList.size(); i++) {

Log.i("---aa", "onCreate: " + MusicManger.getInstance().muiscList.get(i).getTitle());

}

}

}

}

MyBaseAdapter myBaseAdapter = new MyBaseAdapter(MainActivity.this, MusicManger.getInstance().muiscList);

listView.setAdapter(myBaseAdapter);

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view, int position, long ld) {

MusicManger.getInstance().play(position);

}

});

play_iv.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

MusicManger.getInstance().playorPause();

}

});

forword_iv.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

MusicManger.getInstance().forword();

}

});

rewind_iv.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

MusicManger.getInstance().rewind();

}

});

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

@Override

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

if (fromUser)

{

MusicManger.getInstance().seekto(progress);

}

}

@Override

public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override

public void onStopTrackingTouch(SeekBar seekBar) {

}

});

timer=new Timer();

timer.schedule(new TimerTask() {

@Override

public void run() {

handler.post(new Runnable() {

@Override

public void run() {

int cur=MusicManger.getInstance().getcur();

int dur=MusicManger.getInstance().getdur();

SimpleDateFormat simpleDateFormat=new SimpleDateFormat("mm:ss");

cur_tv.setText(simpleDateFormat.format(cur));

dur_tv.setText(simpleDateFormat.format(dur));

seekBar.setMax(dur);

seekBar.setProgress(cur);

}

});

}

},0,100);

mode_iv.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

PopupWindow popupWindow=new PopupWindow();

popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);

popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);

popupWindow.setOutsideTouchable(true);

View pop= LayoutInflater.from(MainActivity.this).inflate(R.layout.pop,null);

popupWindow.setContentView(pop);

popupWindow.showAsDropDown(mode_iv,50,-180);

}

});

}

}

public void initview(){

listView=findViewById(R.id.lv);

play_iv=findViewById(R.id.play_iv);

forword_iv=findViewById(R.id.forword_iv);

rewind_iv=findViewById(R.id.rewind_iv);

seekBar=findViewById(R.id.seekbar);

cur_tv=findViewById(R.id.cur_tv);

dur_tv=findViewById(R.id.dur_tv);

mode_iv=findViewById(R.id.mode_iv);

}

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值