Android开发本地及网络Mp3音乐播放器(四)实现音乐播放_android.net.uri 设置网络歌曲-程序员宅基地

技术标签: JAVA  界面span idtransmarksp  AndroidNetMp3Player  andrspan idtransmark  网span idtransmarkspa  音span idtransmarkspa  android stspan idtra  Android Studio 开发本地网络音乐播放器  Android  

建立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);
    }
}



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iwanghang/article/details/51194140

智能推荐

tensorflow学习笔记(八):LSTM手写体(MNIST)识别_mnist lstm-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏8次。本文简单讲解了LSTM网络,然后针对MNIST数据集,讲解了LSTM进行数据集分类常用到的函数,最后给出了实战代码。_mnist lstm

10个CSS3动画工具,值得你收藏!-程序员宅基地

文章浏览阅读409次。关注公众号前端开发博客,回复“加群”加入我们一起学习,天天进步转之公众号:web前端开发人类对于运动的食物往往会投入更多的关注,因此巧妙的使用动画能够极大地提升网站的用户体验,快速唤起..._magic animations

题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问_函数的递归调用,用递归的方式编写 有5个人坐在一起,问第5个人多少岁,他说比第4个-程序员宅基地

文章浏览阅读1.2w次。题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,以此类推,推到第一人(10岁),再往回推。已知第一个人10岁,之后每个人比前一个人大..._函数的递归调用,用递归的方式编写 有5个人坐在一起,问第5个人多少岁,他说比第4个

【LSTM时序预测】基于长短记忆神经网络LSTM实现交通流时间序列单步预测含验证和预测未来附matlab代码_lstm交通流预测matlab-程序员宅基地

文章浏览阅读336次。有效地预测使用阶段的故障数据对于合理制定可靠性计划以及开展可靠性维护活动等具有重要的指导意义.从复杂系统的历史故障数据出发,提出了一种基于长短期记忆(LSTM)循环神经网络的故障时间序列预测方法,包括网络结构设计,网络训练和预测过程实现算法等,进一步以预测误差最小为目标,提出了一种基于多层网格搜索的LSTM预测模型参数优选算法,通过与多种典型时间序列预测模型的实验对比,验证了所提出的LSTM预测模型及其参数优选算法在故障时间序列分析中具有很强的适用性和更高的准确性._lstm交通流预测matlab

滑动选择控件的简单使用_android滑动选择-程序员宅基地

文章浏览阅读413次。com.github.gzuliyujiang.wheelview.widget.WheelView滑动选择控件的简单使用_android滑动选择

利用venv创建python虚拟环境_python venv 其它的版本-程序员宅基地

该文章介绍了如何使用python自带的venv创建虚拟环境,并包括升级pip、查看pip版本、安装包、生成requirements文件等操作。

随便推点

J2ME好网址-程序员宅基地

文章浏览阅读544次。http://www.j2medev.com/index.htmlhttp://www.j2medev.com/bbs/index.asp?boardid=1http://www.webstudy8.com/web/jsp/403/069316073210831.html http://lib131451.ku.8844.com/ 手机数据库http://www.pcppc.c

mybatis控制台打印Sql的两种方式_mybatis 打印sql-程序员宅基地

文章浏览阅读6.2k次,点赞2次,收藏3次。第一种方式maven工程下pom.xml 添加 log4j日志<!-- 日志 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>在resou_mybatis 打印sql

数据库迁移从access到mysql_图文详解2种将ACCESS数据库迁移到SQLSERVER数据库的方法...-程序员宅基地

文章浏览阅读631次。数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,简单来说数据库它本身可视化成电子化的文件柜,也就是能够存储电子化文件的处所,用户可以对文件中的数据进行新增、截取、更新、以及删除等等操作。更进一步来说,数据库中的数据是以一定方式存储在一起、能为多个用户共享,且具有可能小的冗余度,以及能与应用程序彼此独立。那本文主要是介绍Access数据库迁移到SQLSERVER数据库的两种方法..._access数据库迁移数据到mysql

rdf3x-0.3.7使用入门_rdf windows c++-程序员宅基地

文章浏览阅读2.4k次。最近在做rdf的数据存储与推理,rdf3x是一个比较火的方案。在github上早就放出了源代码,基于C++开发的,而且是给了Makefile文件的方式,但是如果不熟悉C++开发的同学可能不知道如何入手。我也是自己摸索,这篇算是一个总结,对于C++大牛来说应该是皮毛中的皮毛。写下此篇的目的是搜索了很多,没有对应的解决方案。进入正题。一、资源下载1、rdf3x https:_rdf windows c++

phpstorm的安装及解释器配置和使用_安装phpstorm后安装解释器-程序员宅基地

文章浏览阅读1.1w次,点赞8次,收藏31次。phpstorm的安装及解释器配置和使用1、安装链接:https://pan.baidu.com/s/1tpvTslv-ZFpr6lqfR26F2w提取码:60vr下载后安装,点击exe文件,建议不要安装在c盘生成快捷方式和添加环境变量然后一路默认安装即可一路打开,可以先不安装开始的那些插件然后是婆劫https://www.cnblogs.com/ningjiabing/p/12972486.html2、使用创建一个项目放在你想要的地方,然后新建一个php文件,这个时候,右下角会提示_安装phpstorm后安装解释器

java/jsp/ssm红叶房屋租售管理系统【2024年毕设】-程序员宅基地

文章浏览阅读18次。springboot基于Java和SQLserver的医院血库管理系统。springboot基于SpringBootVue的校园信息共享系统。springbootxxx餐厅自主点餐系统的设计与实现。springboot基于微信小程序的古诗词学习阅读平台。jsp基于Java的服装信息管理系统的设计与实现。springboot基于Java的动漫网站。ssm基于微信小程序的校园空闲教室预约系统。ssm基于微信小程序的健康饮食推荐系统。ssm基于Java的图书馆座位预约系统。

推荐文章

热门文章

相关标签