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添加以下代码:
 *<service
 *android:name=".PlayService"
 *android:enabled="true"
 *android:exported="true">
 *</service>
 */
public class PlayService extends Service {
    private MediaPlayer mPlayer;
    private int currentPosition;//当前正在播放的歌曲的位置
    ArrayList<Mp3Info> 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<mp3Infos.size()){
            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<Mp3Info> 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<Mp3Info> 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);
    }
}



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值