android 关联mp3,Android开发本地及网络Mp3音乐播放器(四)实现音乐播放

建立PlayService服务

package com.iwanghang.drmplayer;

import android.app.Service;

import android.content.Intent;

import android.media.MediaPlayer;

import android.net.Uri;

import android.os.Binder;

import android.os.IBinder;

import com.iwanghang.drmplayer.utils.MediaUtils;

import com.iwanghang.drmplayer.vo.Mp3Info;

import java.io.IOException;

import java.util.ArrayList;

/**

* 音乐播放的服务组件

* 实现功能:

* 播放

* 暂停

* 下一首

* 上一首

* 获取当前歌曲的播放进度

*

* 需要在AndroidManifest.xml添加以下代码:

*

*android:name=".PlayService"

*android:enabled="true"

*android:exported="true">

*

*/

public class PlayService extends Service {

private MediaPlayer mPlayer;

private int currentPosition;//当前正在播放的歌曲的位置

ArrayList mp3Infos;

public PlayService() {

}

//内部类PlayBinder实现Binder,

class PlayBinder extends Binder{

public PlayService getPlayService(){

System.out.println("PlayService #1 " + PlayService.this);

return PlayService.this;

}

}

@Override

public IBinder onBind(Intent intent) {

return new PlayBinder();//通过PlayBinder拿到PlayService,给Activity调用

}

@Override

public void onCreate() {

super.onCreate();

mPlayer = new MediaPlayer();

mp3Infos = MediaUtils.getMp3Infos(this);//获取Mp3列表

}

//播放

public void play(int position){

if (position>=0 && position

Mp3Info mp3Info = mp3Infos.get(position);//获取mp3Info对象

//进行播放,播放前判断

try {

mPlayer.reset();//复位

mPlayer.setDataSource(this, Uri.parse(mp3Info.getUrl()));//资源解析,Mp3地址

mPlayer.prepare();//准备

mPlayer.start();//开始(播放)

currentPosition = position;//保存当前位置到currentPosition,比如第一首,currentPosition = 1

} catch (IOException e) {

e.printStackTrace();

}

}

}

//暂停

public void pause(){

if (mPlayer.isPlaying()){

mPlayer.pause();

}

}

//下一首

public void next(){

if (currentPosition>=mp3Infos.size()-1){//如果超出最大值,(因为第一首是0),说明已经是最后一首

currentPosition = 0;//回到第一首

}else {

currentPosition++;//下一首

}

play(currentPosition);

}

//上一首 previous

public void prev(){

if (currentPosition-1<0){//如果上一首小于0,说明已经是第一首

currentPosition = mp3Infos.size()-1;//回到最后一首

}else {

currentPosition--;//上一首

}

play(currentPosition);

}

//

public void start(){

if (mPlayer!=null && !mPlayer.isPlaying()){//判断当前歌曲不等于空,并且没有在播放的状态

mPlayer.start();

}

}

}

建立BaseActivity实现Demo中所有服务的绑定和解绑

package com.iwanghang.drmplayer;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.os.Bundle;

import android.os.IBinder;

import android.support.v4.app.FragmentActivity;

/**

* Created by iwanghang on 16/4/19.

* MainActivity继承BaseActivity,实现APP所有绑定功能

* 继承后,直接调用子类方法,就可以进行绑定和解除,bindPlayService,unbindPlayService

*/

public class BaseActivity extends FragmentActivity{

protected PlayService playService;

private boolean isBound = false;//是否已经绑定

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

}

//绑定Service

private ServiceConnection conn = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

//转换

PlayService.PlayBinder playBinder = (PlayService.PlayBinder) service;

playService = playBinder.getPlayService();

}

@Override

public void onServiceDisconnected(ComponentName name) {

playService = null;

isBound = false;

}

};

//绑定服务

public void bindPlayService(){

if(!isBound) {

Intent intent = new Intent(this, PlayService.class);

bindService(intent, conn, Context.BIND_AUTO_CREATE);

isBound = true;

}

}

//解除绑定服务

public void unbindPlayService(){

if(isBound) {

unbindService(conn);

isBound = false;

}

}

}

在欢迎页面中启动服务

//在欢迎界面启动服务

//先将服务器启动起来,然后进行绑定和解除绑定,服务不会被结束;否则,解除绑定是,服务会自动被回收

startService(new Intent(this,PlayService.class));

在MyMusicListFragment中绑定和解绑PlayService服务

首先继承OnItemClickListener

public class MyMusicListFragment extends Fragment implements AdapterView.OnItemClickListener

package com.iwanghang.drmplayer;

import android.content.Context;

import android.os.Bundle;

import android.support.annotation.Nullable;

import android.support.v4.app.Fragment;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.AdapterView;

import android.widget.ListView;

import com.iwanghang.drmplayer.adapter.MyMusicListAdapter;

import com.iwanghang.drmplayer.utils.MediaUtils;

import com.iwanghang.drmplayer.vo.Mp3Info;

import java.util.ArrayList;

/**

* Created by iwanghang on 16/4/16.

*/

public class MyMusicListFragment extends Fragment implements AdapterView.OnItemClickListener {

//public class MyMusicListFragment extends Fragment {

private ListView listView_my_music;

private ArrayList mp3Infos;

private MyMusicListAdapter myMusicListAdapter;

private MainActivity mainActivity;

//onAttach(),当fragment被绑定到activity时被调用(Activity会被传入.).

@Override

public void onAttach(Context context) {

super.onAttach(context);

mainActivity = (MainActivity) context;

}

public static MyMusicListFragment newInstance() {

MyMusicListFragment my = new MyMusicListFragment();

return my;

}

//onCreateView(),创建和fragment关联的view hierarchy时调用.

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.my_music_list_layout,null);

listView_my_music = (ListView) view.findViewById(R.id.listView_my_music);

//

listView_my_music.setOnItemClickListener(this);

//

loadData();

//绑定服务

//服务在加载SplashActivity(欢迎页面)的时候,已经启动

mainActivity.bindPlayService();

return view;

}

//onDestroyView(),当和fragment关联的view hierarchy正在被移除时调用.

@Override

public void onDestroyView() {

super.onDestroyView();

//解绑服务

//在Activity销毁时,解绑

mainActivity.unbindPlayService();

}

/**

* 加载本地音乐列表

*/

private void loadData(){

mp3Infos = MediaUtils.getMp3Infos(mainActivity);

myMusicListAdapter = new MyMusicListAdapter(mainActivity,mp3Infos);

listView_my_music.setAdapter(myMusicListAdapter);

}

// public ListView getListView_my_music() {

// return listView_my_music;

// }

//

// public ArrayList getMp3Infos() {

// return mp3Infos;

// }

//

// public MyMusicListAdapter getMyMusicListAdapter() {

// return myMusicListAdapter;

// }

//

// public MainActivity getMainActivity() {

// return mainActivity;

// }

@Override

public void onItemClick(AdapterView> parent, View view, int position, long id) {

mainActivity.playService.play(position);

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值