Service实现后台音乐播放器

简单实现音乐播放器,通过服务去操作播放器的上一首、下一首、播放和暂停
操作播放器的主要几种方法:

  • start();开始播放
  • setDataSource(String path)设置数据源
  • seekTo(int msec)设置指定播放位置(毫秒)
  • getCurrentPosition()当前播放位置(毫秒)
  • getDuration()获得时长
  • pause()暂停
  • reset()重新开始
  • stop()停止
  • isPlaying()是否正在播放
  • setVolume()设置音量
  • prepare()释放资源
注意:此播放器只能访问本地已下载的歌曲,如果没有本地歌曲则实现不了音乐播放器功能。
注册清单需要添加:
<service android:name=".MusicService"/>//服务注册
/*
注册SD卡的读与写
*/
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

界面效果:

在这里插入图片描述

访问音乐文件的URI:MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
标签名:
	//MediaStore.Audio.Media.TITLE歌名
    //MediaStore.Audio.Media.DURATION总时长
    //MediaStore.Audio.Media.DATA地址

布局代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Music_Activity">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/rl"
        >
    </ListView>
    <RelativeLayout
        android:id="@+id/rl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        >
        <ImageView
            android:id="@+id/start"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:drawable/ic_media_play"
            android:layout_centerHorizontal="true"
            android:visibility="gone"
            />
        <ImageView
            android:id="@+id/pause"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:drawable/ic_media_pause"
            android:layout_centerHorizontal="true"
            />
        <Button
            android:id="@+id/next"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="下一首"
            android:layout_alignParentRight="true"
            />
        <Button
            android:id="@+id/prev"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="上一首"
            />
    </RelativeLayout>
</RelativeLayout>

ListView布局代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <TextView
        android:id="@+id/mname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="30dp"
        android:text="歌名"
        android:textSize="30sp"
        />
    <TextView
        android:id="@+id/mtime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true"
        android:layout_marginRight="30dp"
        android:textSize="20sp"
        android:text="时长"
        />
</RelativeLayout>

java主类代码:

package com.example.music_task;

import android.app.Service;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.ServiceConnection;
import android.database.Cursor;
import android.net.Uri;
import android.os.IBinder;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class Music_Activity extends AppCompatActivity {

    static int index;

    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    ContentResolver resolver;
    ArrayList<Music>  musics;
    ListView lv;
    MyListViewAdapter adapter;
    MusicService musicService;

    Button next;
    Button prev;
    ImageView kaishi;
    ImageView pause;
    ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            musicService = ((MusicService.MyBinder)service).getMusicService();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_music);
        //初始化
        init();
        Check();

        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                index = position;
                musicService.play(musics,position);
                Toast.makeText(Music_Activity.this, musics.get(position).getName(), Toast.LENGTH_SHORT).show();
            }
        });
        //下一首
        next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("mainindex###",index+"");
                index+=1;
                if(index < 3){
                    musicService.next(musics,index);
                }else{
                    index = 0;
                    musicService.next(musics,index);
                }

            }
        });
        //上一首
        prev.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                index-=1;
                if(index < 0){
                    index = 2;
                    musicService.next(musics,index);
                }else{
                    musicService.prev(musics,index);
                }
            }
        });
        //开始监听
        kaishi.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                kaishi.setVisibility(View.GONE);
                pause.setVisibility(View.VISIBLE);
                musicService.pause_me();
            }
        });
        //暂停监听
        pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                kaishi.setVisibility(View.VISIBLE);
                pause.setVisibility(View.GONE);
                musicService.pause_me();
            }
        });
    }
    /**
     * 初始化
     */
    public void init(){
        //MediaStore.Audio.Media.TITLE歌名
        //MediaStore.Audio.Media.DURATION总时长
        //MediaStore.Audio.Media.DATA地址
        lv = findViewById(R.id.lv);
        next = findViewById(R.id.next);
        prev = findViewById(R.id.prev);
        kaishi = findViewById(R.id.start);
        pause = findViewById(R.id.pause);

        musics = new ArrayList<>();
        resolver = getContentResolver();
        String col[]={MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.DATA};
        Cursor query = resolver.query(uri, col, null, null, null);

        while(query.moveToNext()){
            String name = query.getString(query.getColumnIndex(col[0]));
            String time = query.getString(query.getColumnIndex(col[1]));
            String patn = query.getString(query.getColumnIndex(col[2]));
            musics.add(new Music(name,patn,time));
        }
        //设置适配器
        adapter = new MyListViewAdapter(musics,this);
        lv.setAdapter(adapter);
        //绑定服务
        Intent intent = new Intent(Music_Activity.this, MusicService.class);
        bindService(intent,connection, Service.BIND_AUTO_CREATE);
        Log.e("###init","初始化完毕");
    }
    public void Check(){
        /**
         * 测试是否添加进集合
         */
        for (Music m: musics) {
            Log.e("music###",m.toString());
        }
    }

    /**
     * 服务解绑
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(connection);
    }
}

Music类

package com.example.music_task;

public class Music {
    String name;
    String path;
    String time;

    public Music(String name, String path, String time) {
        this.name = name;
        this.path = path;
        this.time = time;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    @Override
    public String toString() {
        return "Music{" +
                "name='" + name + '\'' +
                ", path='" + path + '\'' +
                ", time='" + time + '\'' +
                '}';
    }
}

Service类

package com.example.music_task;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

import java.io.IOException;
import java.util.ArrayList;

/**
 * 服务类
 */
public class MusicService extends Service {

    MediaPlayer player;

    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    public class MyBinder extends Binder{
        public MusicService getMusicService(){
            return MusicService.this;
        }
    }
    //播放方法
    public void play(ArrayList<Music> music,int index){
        try {

            if(player == null){
                player = new MediaPlayer();
                Log.e("path###",music.get(index).getPath());
                player.setDataSource(music.get(index).getPath());
                player.prepare();
                player.start();
            }else{
                player.stop();
                player.release();
                player = null;
                player = new MediaPlayer();
                Log.e("path###",music.get(index).getPath());
                player.setDataSource(music.get(index).getPath());
                player.prepare();
                player.start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //暂停方法
    public void pause_me(){
        if(player.isPlaying()){
            player.pause();
        }else{
            player.start();
        }
    }
    //下一首
    public void next(ArrayList<Music> music,int index){
        if(player.isPlaying()){
            if(index < 3){
                player.stop();
                player.release();
                player = null;
                Log.e("index###",index+"");
                play(music,index);
            }
        }
    }
    //上一首
    public void prev(ArrayList<Music> music,int index){
        if(player.isPlaying()){
                player.stop();
                player.release();
                player = null;
                Log.e("index###",index+"");
                play(music,index);
        }
    }
}

ListView适配器:

package com.example.music_task;

import android.content.ContentResolver;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;

public class MyListViewAdapter extends BaseAdapter {

    ArrayList<Music> music;
    Context context;

    public MyListViewAdapter(ArrayList<Music> music, Context context) {
        this.music = music;
        this.context = context;
    }

    @Override
    public int getCount() {
        return music.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        MyHolder myHolder = null;

        if(convertView == null){
            convertView = View.inflate(context,R.layout.music_item,null);
            myHolder = new MyHolder();
            myHolder.mname = convertView.findViewById(R.id.mname);
            myHolder.mtime = convertView.findViewById(R.id.mtime);
            convertView.setTag(myHolder);
        }else{
            myHolder = (MyHolder)convertView.getTag();
        }

        if(myHolder != null){
            myHolder.mname.setText(music.get(position).getName());
            myHolder.mtime.setText(music.get(position).getTime());
        }

        return convertView;
    }
    public class MyHolder{
        TextView mname;
        TextView mtime;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44946212/article/details/90647269