用服务器制作音乐播放器

用服务器制作音乐播放器

ACtivity

package com.example.musicplayer_server;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.Manifest;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.TextView;

import com.example.musicplayer_server.Server.MyService;
import com.example.musicplayer_server.adapter.MyAdapter;
import com.example.musicplayer_server.entity.MusicBean;
import com.example.musicplayer_server.entity.MusicUtils;

import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {

    private ListView lv;
    private ImageView imageViewPic1;
    private TextView textViewName;
    private SeekBar seekBarId;
    private ImageButton imageViewList;
    private ImageButton imageViewPrev;
    private ImageButton imageViewPlay;
    private ImageButton imageViewNext;

    private static final String TAG = "MainActivity";
    private MyAdapter adapter;
    private MyService.MusicBinder musicBinder;
    private List<MusicBean> list;
    private ServiceConnection serviceConnection;
    private  Intent intent;
    private int index = 0;//下标
    private MyReceiver myReceiver;
    private boolean isplay = false;
    private Timer timer;

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 101:
                    isplay = true;
                    musicBinder.callRestart();
                    timerTask();
                    imageViewPlay.setBackgroundResource(R.drawable.playbar_btn_pause);
                    break;
                case 102:
                    isplay = false;
                    musicBinder.callPause();
                    timerTask();
                    imageViewPlay.setBackgroundResource(R.drawable.playbar_btn_play);
                    break;
                case 103:
                    isplay = true;
                    musicBinder.callNext();
                    timerTask();
                    imageViewPlay.setBackgroundResource(R.drawable.playbar_btn_pause);
                    Log.i(TAG, "handleMessage: next");
                    break;
                case 104:
                    isplay = true;
                    musicBinder.callNavSong();
                    timerTask();
                    imageViewPlay.setBackgroundResource(R.drawable.playbar_btn_pause);
                    Log.i(TAG, "handleMessage: navsong");
                    break;
            }
        }
    } ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},101);
        }else {
            startService();
            list = MusicUtils.queryMusic(this);
            adapter = new MyAdapter(this,list);
            lv.setAdapter(adapter);
        }

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.zrx.play");
        intentFilter.addAction("com.zrx.pause");
        intentFilter.addAction("com.zrx.next");
        intentFilter.addAction("com.zrx.prev");
        myReceiver = new MyReceiver(handler);
        registerReceiver(myReceiver,intentFilter);

        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                index = position;
                isplay = true;
                textViewName.setText(list.get(position).getTitle());
                Log.i(TAG, "onItemClick: ");
                musicBinder.callPlay(position);
                timerTask();
                imageViewPlay.setBackgroundResource(R.drawable.playbar_btn_pause);
            }
        });


        seekBarId.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser){
                    musicBinder.callSetMusicPosition(progress);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

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

        imageViewNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                isplay = true;
                index++;
                if (index > list.size() - 1){
                    index = 0;
                }
                musicBinder.callNext();
                textViewName.setText(list.get(index).getTitle());
                imageViewPlay.setBackgroundResource(R.drawable.playbar_btn_pause);
            }
        });

        imageViewPrev.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                isplay = true;
                index--;
                if (index < 0){
                    index = list.size()-1;
                }
                musicBinder.callNavSong();
                textViewName.setText(list.get(index).getTitle());
                imageViewPlay.setBackgroundResource(R.drawable.playbar_btn_pause);
            }
        });

        imageViewPlay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isplay){
                    isplay = false;
                    musicBinder.callPause();
                    imageViewPlay.setBackgroundResource(R.drawable.playbar_btn_play);
                }else {
                    isplay = true;
                    musicBinder.callRestart();
                    imageViewPlay.setBackgroundResource(R.drawable.playbar_btn_pause);
                }
            }
        });
    }

    private void timerTask() {

        if (timer != null){
            timer.cancel();
        }

        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                seekBarId.setMax(musicBinder.callSeekBarMax());
                seekBarId.setProgress(musicBinder.callSetBarPosition());
            }
        }, 0, 1000);
    }

    private void startService() {
        intent = new Intent(this, MyService.class);

        startService(intent);

        serviceConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                musicBinder = (MyService.MusicBinder) service;
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        };
        bindService(intent,serviceConnection, Service.BIND_AUTO_CREATE);
    }

    private void initView() {
        lv = (ListView) findViewById(R.id.lv);
        imageViewPic1 = (ImageView) findViewById(R.id.imageView_pic_1);
        textViewName = (TextView) findViewById(R.id.textView_name);
        seekBarId = (SeekBar) findViewById(R.id.seekBar_id);
        imageViewList = (ImageButton) findViewById(R.id.imageView_list);
        imageViewPrev = (ImageButton) findViewById(R.id.imageView_prev);
        imageViewPlay = (ImageButton) findViewById(R.id.imageView_play);
        imageViewNext = (ImageButton) findViewById(R.id.imageView_next);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 101 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            startService();
            list = MusicUtils.queryMusic(this);
            adapter = new MyAdapter(this,list);
            lv.setAdapter(adapter);
        }else {
            finish();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (serviceConnection != null){
            unbindService(serviceConnection);
        }
        unregisterReceiver(myReceiver);
        if (intent != null){
            stopService(intent);
        }
    }
}

service

package com.example.musicplayer_server.Server;

import android.app.Notification;
import android.app.PendingIntent;
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 android.widget.RemoteViews;

import com.example.musicplayer_server.R;
import com.example.musicplayer_server.entity.MusicBean;
import com.example.musicplayer_server.entity.MusicUtils;

import java.io.IOException;
import java.util.List;

public class MyService extends Service {

    private static final String TAG = "MyService";
    private MediaPlayer mediaPlayer;
    private List<MusicBean> list;
    private int i;
    private RemoteViews remoteViews;
    private Notification.Builder builder;

    public MyService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mediaPlayer = new MediaPlayer();
        list = MusicUtils.queryMusic(this);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        builder = new Notification.Builder(this);

        builder.setSmallIcon(R.mipmap.ic_launcher);


        remoteViews = new RemoteViews(getPackageName(), R.layout.notifaction_layout);
        builder.setCustomContentView(remoteViews);

        remoteViews.setTextViewText(R.id.textView_name_1,list.get(i).getTitle());

        //播放
        Intent intent1 = new Intent();
        intent1.setAction("com.zrx.play");
        PendingIntent broadcast = PendingIntent.getBroadcast(this, 101, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.imageButton_play, broadcast);

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

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

        //上一首
        Intent intent4 = new Intent();
        intent4.setAction("com.zrx.prev");
        PendingIntent broadcast3 = PendingIntent.getBroadcast(this, 104, intent4, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.imageButton_prev,broadcast3);

        startForeground(102, builder.build());

        return super.onStartCommand(intent, flags, startId);
    }

    public class MusicBinder extends Binder {

        public void callPlay(int index) {
            Log.i(TAG, "callPlay: ");
            play(index);
        }

        public void callPause() {
            pause();
        }

        public void callNext() {
            next();
        }

        public void callNavSong() {
            navSong();
        }

        public void callRestart() {
            reStart();
        }

        public int callSeekBarMax(){
            return setSeekBarMax();
        }

        public int callSetBarPosition(){
            return setBarPosition();
        }

        public void callSetMusicPosition(int position){
            setMusicPosition(position);
        }
    }

    private void setMusicPosition(int position) {
        mediaPlayer.seekTo(position);
    }

    private int setBarPosition() {
        return mediaPlayer.getCurrentPosition();
    }

    private int setSeekBarMax() {
        return Integer.parseInt(list.get(i).getDuration());
    }

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

    private void reStart() {
        mediaPlayer.start();
    }

    private void navSong() {
        i--;
        if (i < 0) {
            i = list.size() - 1;
        }

        play(i);
    }

    private void next() {
        i++;
        if (i > list.size() - 1) {
            i = 0;
        }

        play(i);

    }

    private void pause() {
        mediaPlayer.pause();
    }

    public void play(final int index) {

        remoteViews.setTextViewText(R.id.textView_name_1,list.get(index).getTitle());
        startForeground(102, builder.build());

        Log.i(TAG, "play: "+index);

        i = index;

        try {
            mediaPlayer.reset();
            mediaPlayer.setDataSource(list.get(index).getData());
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    Log.i(TAG, "onPrepared: "+index);
                    mediaPlayer.start();
                }
            });

            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    Log.i(TAG, "onCompletion: "+index);
                    next();
                }
            });

            mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    Log.i(TAG, "onError: " + index);
                    return false;
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mediaPlayer.release();
    }
}

receiver

package com.example.musicplayer_server.Server;

import android.app.Notification;
import android.app.PendingIntent;
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 android.widget.RemoteViews;

import com.example.musicplayer_server.R;
import com.example.musicplayer_server.entity.MusicBean;
import com.example.musicplayer_server.entity.MusicUtils;

import java.io.IOException;
import java.util.List;

public class MyService extends Service {

    private static final String TAG = "MyService";
    private MediaPlayer mediaPlayer;
    private List<MusicBean> list;
    private int i;
    private RemoteViews remoteViews;
    private Notification.Builder builder;

    public MyService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mediaPlayer = new MediaPlayer();
        list = MusicUtils.queryMusic(this);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        builder = new Notification.Builder(this);

        builder.setSmallIcon(R.mipmap.ic_launcher);


        remoteViews = new RemoteViews(getPackageName(), R.layout.notifaction_layout);
        builder.setCustomContentView(remoteViews);

        remoteViews.setTextViewText(R.id.textView_name_1,list.get(i).getTitle());

        //播放
        Intent intent1 = new Intent();
        intent1.setAction("com.zrx.play");
        PendingIntent broadcast = PendingIntent.getBroadcast(this, 101, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.imageButton_play, broadcast);

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

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

        //上一首
        Intent intent4 = new Intent();
        intent4.setAction("com.zrx.prev");
        PendingIntent broadcast3 = PendingIntent.getBroadcast(this, 104, intent4, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.imageButton_prev,broadcast3);

        startForeground(102, builder.build());

        return super.onStartCommand(intent, flags, startId);
    }

    public class MusicBinder extends Binder {

        public void callPlay(int index) {
            Log.i(TAG, "callPlay: ");
            play(index);
        }

        public void callPause() {
            pause();
        }

        public void callNext() {
            next();
        }

        public void callNavSong() {
            navSong();
        }

        public void callRestart() {
            reStart();
        }

        public int callSeekBarMax(){
            return setSeekBarMax();
        }

        public int callSetBarPosition(){
            return setBarPosition();
        }

        public void callSetMusicPosition(int position){
            setMusicPosition(position);
        }
    }

    private void setMusicPosition(int position) {
        mediaPlayer.seekTo(position);
    }

    private int setBarPosition() {
        return mediaPlayer.getCurrentPosition();
    }

    private int setSeekBarMax() {
        return Integer.parseInt(list.get(i).getDuration());
    }

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

    private void reStart() {
        mediaPlayer.start();
    }

    private void navSong() {
        i--;
        if (i < 0) {
            i = list.size() - 1;
        }

        play(i);
    }

    private void next() {
        i++;
        if (i > list.size() - 1) {
            i = 0;
        }

        play(i);

    }

    private void pause() {
        mediaPlayer.pause();
    }

    public void play(final int index) {

        remoteViews.setTextViewText(R.id.textView_name_1,list.get(index).getTitle());
        startForeground(102, builder.build());

        Log.i(TAG, "play: "+index);

        i = index;

        try {
            mediaPlayer.reset();
            mediaPlayer.setDataSource(list.get(index).getData());
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    Log.i(TAG, "onPrepared: "+index);
                    mediaPlayer.start();
                }
            });

            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    Log.i(TAG, "onCompletion: "+index);
                    next();
                }
            });

            mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    Log.i(TAG, "onError: " + index);
                    return false;
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mediaPlayer.release();
    }
}

发布了27 篇原创文章 · 获赞 0 · 访问量 623

猜你喜欢

转载自blog.csdn.net/zrx_z/article/details/102731889