简单的音乐播放器项目

MainActivity

package com.example.app3;

import android.Manifest;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.IBinder;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.SeekBar;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private TextView main_name;
    private SeekBar seekBar;
    private ImageView playlist;
    private ImageView prev;
    private ImageView play;
    private ImageView pause;
    private ImageView next;


    private Intent intent;

    private ServiceConnection connection;
    private MyService.MyMusucBinder binder;

    private List<MusicMessage> lists = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestPermissions(new  String[]{Manifest.permission.READ_EXTERNAL_STORAGE},100);
        // 初始化控件
        initView();

    }

    private void initView() {
        listView = (ListView) findViewById(R.id.listView);
        main_name = (TextView) findViewById(R.id.main_name);
        seekBar = (SeekBar) findViewById(R.id.seekBar);
        playlist = (ImageView) findViewById(R.id.playlist);
        prev = (ImageView) findViewById(R.id.prev);
        play = (ImageView) findViewById(R.id.play);
        pause = (ImageView) findViewById(R.id.pause);
        next = (ImageView) findViewById(R.id.next);
        // Share 类 赋值
        Share.play = play;
        Share.pause = pause;
        Share.main_name = main_name;
        Share.seekBar = seekBar;
        // ListView 的条目点击事件
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Share.index = position;
                binder.callPlay();
            }
        });

        // seekBar 的监听
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // 改变
                if (fromUser){// 判断是否为手动拖动
                    Share.mediaPlayer.seekTo(progress); // 设置拖动后 音乐的进度
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
        });

    }


    // 播放器 图片的点击事件
    public void imageOnClick(View view) {
        switch (view.getId()) {
            case R.id.playlist: // 设置(不同的播放方式:单曲循环/列表循环/随机播放)
                PopupWindow popupWindow = new PopupWindow();

                popupWindow.setWidth(200);
                popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
                popupWindow.setOutsideTouchable(true); // 点击外部取消

                View inflate = getLayoutInflater().inflate(R.layout.pop_layout, null);
                Button random = inflate.findViewById(R.id.random_button);
                Button singe = inflate.findViewById(R.id.singe_button);
                Button elist = inflate.findViewById(R.id.list_button);

                random.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Share.flag = 2;
                    }
                });

                singe.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Share.flag = 1;
                    }
                });

                elist.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Share.flag = 0;
                    }
                });

                popupWindow.setContentView(inflate);

                popupWindow.showAsDropDown(main_name,0,0);
                break;
            case R.id.prev: // 上一曲
                binder.returnMusic();
                break;
            case R.id.play:  //开始
                play.setVisibility(View.GONE);
                pause.setVisibility(View.VISIBLE);
                Share.mediaPlayer.start();
                break;
            case R.id.pause: // 暂停
                pause.setVisibility(View.GONE);
                play.setVisibility(View.VISIBLE);
                Share.mediaPlayer.pause();
                break;
            case R.id.next: // 下一首
                binder.nextMusic();
                break;
        }
    }

    //
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // 开启服务
        intent = new Intent(this, MyService.class);
        startService(intent);

        connection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                binder = (MyService.MyMusucBinder) service;
                Share.binder = binder;
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
            }
        };
        // 绑定服务
        bindService(intent,connection, Service.BIND_AUTO_CREATE);
        lists = new MusicUtils().getMusicDatas(MainActivity.this);
        MyMusicAdapter myMusicAdapter = new MyMusicAdapter(MainActivity.this, lists);
        listView.setAdapter(myMusicAdapter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 解绑 并 停止服务
        unbindService(connection);
        stopService(intent);
        Share.timer.cancel();
    }
}

MusicMessage

package com.example.app3;

public class MusicMessage {
    private String mname;
    private String timeLength;
    private String personName;
    private String site; // 地址
    private String size; // 大小

    public MusicMessage() {
        super();
    }

    public String getMname() {
        return mname;
    }

    public void setMname(String mname) {
        this.mname = mname;
    }

    public String getTimeLength() {
        return timeLength;
    }

    public void setTimeLength(String timeLength) {
        this.timeLength = timeLength;
    }

    public String getPersonName() {
        return personName;
    }

    public void setPersonName(String personName) {
        this.personName = personName;
    }

    public String getSite() {
        return site;
    }

    public void setSite(String site) {
        this.site = site;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    public MusicMessage(String mname, String timeLength, String personName, String site, String size) {
        this.mname = mname;
        this.timeLength = timeLength;
        this.personName = personName;
        this.site = site;
        this.size = size;
    }
}

MusicUtils

package com.example.app3;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;

import java.util.ArrayList;
import java.util.List;

public class MusicUtils {
    public  static  final  int LIST = 2;
    public  static final int RANDOM = 1;
    public  static final int SINGE = 0;

    private List<MusicMessage> lists = new ArrayList<>();

    public  List<MusicMessage> getMusicDatas(Context context){
        ContentResolver contentResolver = context.getContentResolver();
        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                String mname = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)); // 歌名
                String timeLength = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION)); // 时长
                String personName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); // 歌手名
                String site = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));// 获取地址
                String size = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE));// 获取大小
                MusicMessage musicMessage = new MusicMessage(mname, timeLength, personName,site,size);
                lists.add(musicMessage);
            }

        }
        return lists;
    }
}

MyMusicAdapter

package com.example.app3;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.text.SimpleDateFormat;
import java.util.List;

public class MyMusicAdapter extends BaseAdapter {
    private Context context;
    private List<MusicMessage> lists;
    private LayoutInflater layoutInflater;

    public MyMusicAdapter(Context context, List<MusicMessage> lists) {
        this.context = context;
        this.lists = lists;
        layoutInflater = LayoutInflater.from(context);
    }

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

    @Override
    public Object getItem(int position) {
        return lists.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView==null){
            viewHolder = new ViewHolder();
            convertView = layoutInflater.inflate(R.layout.item_layout,null);
            viewHolder.tv_mname = convertView.findViewById(R.id.tv_mname);
            viewHolder.tv_personName = convertView.findViewById(R.id.tv_personName);
            viewHolder.tv_timeLength = convertView.findViewById(R.id.tv_timeLength);
            convertView.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.tv_mname.setText(lists.get(position).getMname());
        viewHolder.tv_personName.setText(lists.get(position).getPersonName());
        int i = Integer.parseInt(lists.get(position).getTimeLength());
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss");
        String format = simpleDateFormat.format(i);

        viewHolder.tv_timeLength.setText(format);
        return convertView;
    }

    class ViewHolder{
            private TextView tv_mname,tv_personName,tv_timeLength;
    }
}

MyReceiver

package com.example.app3;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("com.xiaoka")){ // 开始
            Log.i("---", "onReceive: ---开始播放--------");
            Share.mediaPlayer.start();
        }else if (intent.getAction().equals("com.zanting")){// 暂停
            Log.i("---", "onReceive: ---暂停------------");
            Share.mediaPlayer.pause();
        }else if (intent.getAction().equals("com.next")){ // 下一首
            Log.i("---", "onReceive: ---下一首--------------");
            Share.binder.nextMusic();
        }else if (intent.getAction().equals("com.houtui")){// 返回上一首
            Log.i("---", "onReceive: ---上一首--------------");
            Share.binder.returnMusic();
        }
    }
}

MyService

package com.example.app3;

import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.os.PersistableBundle;
import android.view.View;
import android.widget.RemoteViews;

import java.io.IOException;
import java.security.PublicKey;
import java.util.List;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

public class MyService extends Service {

    private List<MusicMessage> lists;
    private Context context;
    private MediaPlayer mediaPlayer;
    private RemoteViews remoteViews;
    private Notification build;

    @Override
    public void onCreate() {
        super.onCreate();
        lists = new MusicUtils().getMusicDatas(this);
        mediaPlayer = new MediaPlayer();
        Share.mediaPlayer = mediaPlayer;

        // 当播放停止时 调用额方法
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                switch (Share.flag){
                    case 0: // 列表循环
                        Share.binder.nextMusic();
                        break;
                    case 1: // 单寻
                        Share.binder.callPlay();
                        break;
                    case 2: // 随机
                        Random random = new Random();
                        Share.index = random.nextInt(lists.size());
                        Share.binder.callPlay();
                        break;
                }
            }
        });
    }

    public  class MyMusucBinder extends Binder{
        public  void  callPlay(){ // 播放
            play();
        }
        public void nextMusic(){ // 播放下一首音乐 的方法
            next();
        }
        public void returnMusic(){
            reMusic(); // 返回上一首
        }



    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 发送一个前台通知
        Notification.Builder builder = new Notification.Builder(this);
        builder.setSmallIcon(R.mipmap.ic_launcher);
        remoteViews = new RemoteViews(getPackageName(),R.layout.not_item_layout);
        // 实现点击按钮 发送广播
        Intent intent1 = new Intent();// 开始
        intent1.setAction("com.xiaoka");
        PendingIntent broadcast = PendingIntent.getBroadcast(this, 100, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.play,broadcast);

        Intent intent2 = new Intent();// 暂停
        intent2.setAction("com.zanting");
        PendingIntent broadcast1 = PendingIntent.getBroadcast(this, 101, intent2, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.pause,broadcast1);

        Intent intent3 = new Intent();// 下一首
        intent3.setAction("com.next");
        PendingIntent broadcast2 = PendingIntent.getBroadcast(this, 102, intent3, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.next,broadcast2);

        Intent intent4 = new Intent(); // 后退一首
        intent4.setAction("com.houtui");
        PendingIntent broadcast3 = PendingIntent.getBroadcast(this, 103, intent4, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.prev,broadcast3);

        builder.setCustomContentView(remoteViews);
        build = builder.build();
        startForeground(1,build);
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return new MyMusucBinder();
    }
    // 播放的方法
    public void play(){
        remoteViews.setTextViewText(R.id.name,lists.get(Share.index).getMname());
        startForeground(1,build);
        mediaPlayer.reset();
        try {
            mediaPlayer.setDataSource(lists.get(Share.index).getSite());
            mediaPlayer.prepare();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    // 销毁timer
                    Share.timer.cancel();
                    // 切换 开始 暂停的图标
                   Share.play.setVisibility(View.GONE);
                   Share.pause.setVisibility(View.VISIBLE);
                   // 设置seekBar的 最大长度  // 设置 最大时长 Duration 时长
                    Share.seekBar.setMax(mediaPlayer.getDuration());
                   // 改变歌名
                    Share.main_name.setText(lists.get(Share.index).getMname());
                    // 开始播放
                    mediaPlayer.start();
                    // 用timer定时器 设置是谁进度
                    startTimer();
                }

            });
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    // 下一首
    private void next() {
        if (Share.index == lists.size()-1){
            Share.index = 0;
        }else {
            Share.index++;
        }
        play();
    }
    //返回上一曲 的方法
    private void reMusic() {
        if (Share.index == 0){
            Share.index = lists.size()-1;
        }else {
            Share.index--;
        }
        play();
    }
    // timer 计时器 实现实时更新进度的方法
    private void startTimer() {
        Share.timer = new Timer();
        Share.timer.schedule(new TimerTask() {
            @Override
            public void run() {// getCurrentPosition 音乐的播放进度
                Share.seekBar.setProgress(mediaPlayer.getCurrentPosition());
            }
        },0,100);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //release 释放
        mediaPlayer.release();// 释放资源
    }
}

Share

package com.example.app3;

import android.media.MediaPlayer;
import android.widget.ImageView;
import android.widget.RemoteViews;
import android.widget.SeekBar;
import android.widget.TextView;

import java.util.Timer;

public class Share {

    public static ImageView play; // 开始图标
    public static ImageView pause; // 暂停图标
    public static TextView main_name; // 显示歌手名控件

    public static int index; // 记录播放的下标

    public static MyService.MyMusucBinder binder; //

    public static MediaPlayer mediaPlayer; // 播放音乐的对象

    public static SeekBar seekBar; //

    public static Timer timer = new Timer();

    public static int flag = 0;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值