diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8333a5f..662a31e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -33,6 +33,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/example/musicplayer/adapter/SongAdapter.java b/app/src/main/java/com/example/musicplayer/adapter/SongAdapter.java index ca7f450..223eb94 100644 --- a/app/src/main/java/com/example/musicplayer/adapter/SongAdapter.java +++ b/app/src/main/java/com/example/musicplayer/adapter/SongAdapter.java @@ -26,11 +26,13 @@ import java.util.List; */ public class SongAdapter extends RecyclerView.Adapter { + private static final String TAG="jsyjst"; private int footerViewType = 1; private int itemViewType = 0; private List mMp3InfoList; private Context mContext; private int mLastPosition = -1; + private int defaultPosition; private Song song=new Song(); private OnItemClickListener onItemClickListener; @@ -99,7 +101,9 @@ public class SongAdapter extends RecyclerView.Adapter { holder.songNameTv.setText(mp3Info.getTitle()); holder.artistTv.setText(mp3Info.getArtist()); + mLastPosition=FileHelper.getSong().getCurrent(); holder.playingIv.setVisibility(position == mLastPosition ? View.VISIBLE : View.GONE); +// holder.playingIv.setVisibility(position==FileHelper.getSong().getCurrent()?View.VISIBLE:View.GONE); holder.songView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -110,10 +114,13 @@ public class SongAdapter extends RecyclerView.Adapter { song.setSize(mp3Info.getSize()); song.setTitle(mp3Info.getTitle()); song.setUrl(mp3Info.getUrl()); + song.setCurrent(position); - Log.d("jsysjt","------"+song.getArtist()+"/"+song.getTitle()+"/"+song.getDuration()+"/"+song.getSize()); + Log.d(TAG, "onClick: "+position); FileHelper.saveSong(song); - onItemClickListener.onSongClick(position); + onItemClickListener.onSongClick(); + + defaultPosition=FileHelper.getSong().getCurrent(); equalPosition(position); @@ -148,7 +155,7 @@ public class SongAdapter extends RecyclerView.Adapter { public interface OnItemClickListener{ - void onSongClick(int position); + void onSongClick(); } } diff --git a/app/src/main/java/com/example/musicplayer/entiy/Song.java b/app/src/main/java/com/example/musicplayer/entiy/Song.java index 8acbc1e..97efc1d 100644 --- a/app/src/main/java/com/example/musicplayer/entiy/Song.java +++ b/app/src/main/java/com/example/musicplayer/entiy/Song.java @@ -15,6 +15,7 @@ public class Song implements Serializable { private long size; private String url; private long currentTime; + private int current;//在本地音乐的位置 public long getSize() { return size; @@ -64,9 +65,17 @@ public class Song implements Serializable { this.currentTime = currentTime; } + public int getCurrent() { + return current; + } + + public void setCurrent(int current) { + this.current = current; + } + public String toString(){ - return - "artist="+artist+",title="+title+",url="+url+",duration="+duration+",size"+size+",currentTime="+currentTime; + return "artist="+artist+",title="+title+",url="+url+",duration="+duration+ + ",size"+size+",currentTime="+currentTime+",current"+current; } } diff --git a/app/src/main/java/com/example/musicplayer/service/PlayerService.java b/app/src/main/java/com/example/musicplayer/service/PlayerService.java index e87b933..3d9b519 100644 --- a/app/src/main/java/com/example/musicplayer/service/PlayerService.java +++ b/app/src/main/java/com/example/musicplayer/service/PlayerService.java @@ -3,14 +3,12 @@ package com.example.musicplayer.service; import android.annotation.SuppressLint; import android.app.Service; import android.content.Intent; +import android.content.IntentFilter; import android.media.MediaPlayer; import android.os.Binder; -import android.os.Handler; import android.os.IBinder; -import android.os.Message; import android.util.Log; -import com.example.musicplayer.constant.PlayerStatus; import com.example.musicplayer.entiy.Mp3Info; import com.example.musicplayer.entiy.Song; import com.example.musicplayer.util.FileHelper; @@ -18,10 +16,6 @@ import com.example.musicplayer.util.MediaUntil; import java.util.List; -import static android.content.ContentValues.TAG; -import static com.example.musicplayer.constant.PlayerStatus.PAUSE; -import static com.example.musicplayer.constant.PlayerStatus.STOP; - @SuppressLint("NewApi") public class PlayerService extends Service { @@ -34,6 +28,8 @@ public class PlayerService extends Service { private List mMp3InfoList; private int mCurrent; + private IntentFilter intentFilter; + @Override public void onCreate(){ mMp3InfoList= MediaUntil.getMp3Info(); @@ -47,9 +43,21 @@ public class PlayerService extends Service { @Override public void onCompletion(MediaPlayer mp) { mCurrent++; + + //将歌曲的信息保存起来 + Song song=FileHelper.getSong(); + song.setCurrent(mCurrent); + song.setTitle(mMp3InfoList.get(mCurrent).getTitle()); + song.setArtist(mMp3InfoList.get(mCurrent).getArtist()); + song.setDuration(mMp3InfoList.get(mCurrent).getDuration()); + song.setUrl(mMp3InfoList.get(mCurrent).getUrl()); + FileHelper.saveSong(song); if(mCurrent<=mMp3InfoList.size()){ mPlayStatusBinder.play(0); + }else{ + mPlayStatusBinder.stop(); } + sendBroadcast(new Intent("android.song.change")); //发送广播改变播放栏的信息 } }); return mPlayStatusBinder; @@ -72,7 +80,7 @@ public class PlayerService extends Service { public void play(int currentTime) { try { - song = FileHelper.getSong(); + mCurrent = FileHelper.getSong().getCurrent(); mediaPlayer.reset();//把各项参数恢复到初始状态 mediaPlayer.setDataSource(mMp3InfoList.get(mCurrent).getUrl()); mediaPlayer.prepare(); //进行缓冲 @@ -103,7 +111,26 @@ public class PlayerService extends Service { isPause=false; } } + public void next(){ + mCurrent=FileHelper.getSong().getCurrent(); + mCurrent++; + if(mCurrent>mMp3InfoList.size()){ + mCurrent=1; + } + //将歌曲的信息保存起来 + Song song=FileHelper.getSong(); + song.setCurrent(mCurrent); + song.setTitle(mMp3InfoList.get(mCurrent).getTitle()); + song.setArtist(mMp3InfoList.get(mCurrent).getArtist()); + song.setDuration(mMp3InfoList.get(mCurrent).getDuration()); + song.setUrl(mMp3InfoList.get(mCurrent).getUrl()); + FileHelper.saveSong(song); + mPlayStatusBinder.play(0); + + + sendBroadcast(new Intent("android.song.change")); //发送广播改变播放栏的信息 + } /** * 停止音乐 @@ -133,8 +160,8 @@ public class PlayerService extends Service { return mediaPlayer; } - public void setCurrent(int current){ - mCurrent=current; + public long getCurrentTime(){ + return mediaPlayer.getCurrentPosition(); } } diff --git a/app/src/main/java/com/example/musicplayer/view/LocalMusicFragment.java b/app/src/main/java/com/example/musicplayer/view/LocalMusicFragment.java index 14fbd03..1fc5b0c 100644 --- a/app/src/main/java/com/example/musicplayer/view/LocalMusicFragment.java +++ b/app/src/main/java/com/example/musicplayer/view/LocalMusicFragment.java @@ -1,8 +1,10 @@ package com.example.musicplayer.view; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.ServiceConnection; import android.media.MediaPlayer; import android.os.Bundle; @@ -52,10 +54,13 @@ public class LocalMusicFragment extends Fragment implements ILocalMusicContract. private TextView mSongNameTv; private TextView mSinger; private Song mSong; - private int current;//记录播放歌曲的位置 + private int mCurrent;//记录播放歌曲的位置 private SongAdapter songAdapter; //在onServiceConnected中获取PlayStatusBinder的实例,从而调用服务里面的方法 private PlayerService.PlayStatusBinder mPlayStatusBinder; + + + private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { @@ -85,6 +90,9 @@ public class LocalMusicFragment extends Fragment implements ILocalMusicContract. @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); + + + initView(); setOnClickListener(); @@ -171,12 +179,10 @@ public class LocalMusicFragment extends Fragment implements ILocalMusicContract. // songAdapter.setOnItemClickListener(new SongAdapter.OnItemClickListener() { @Override - public void onSongClick(int position) { + public void onSongClick() { mSong = FileHelper.getSong(); - Log.d("jsyjsy", "----------------" + mSong.getTitle()); mSongNameTv.setText(mSong.getTitle()); mSinger.setText(mSong.getArtist()); - mPlayStatusBinder.setCurrent(position); mPlayStatusBinder.play(0); mMediaPlayer = mPlayStatusBinder.getMediaPlayer(); @@ -197,6 +203,8 @@ public class LocalMusicFragment extends Fragment implements ILocalMusicContract. mMp3InfoList.addAll(mp3InfoList); LinearLayoutManager layoutManager = new LinearLayoutManager(mView.getContext()); mRecycler.setLayoutManager(layoutManager); + //令recyclerView定位到当前播放的位置 + layoutManager.scrollToPositionWithOffset(FileHelper.getSong().getCurrent()+1,mRecycler.getHeight()); songAdapter.notifyDataSetChanged(); mRecycler.setAdapter(songAdapter); } @@ -210,20 +218,6 @@ public class LocalMusicFragment extends Fragment implements ILocalMusicContract. } - - @Override - public void onDetach() { - super.onDetach(); - if (mMediaPlayer != null) { - Song song = FileHelper.getSong(); - song.setCurrentTime(mMediaPlayer.getCurrentPosition()); - Log.d(TAG, "onDetach: " + mMediaPlayer.getCurrentPosition()); - FileHelper.saveSong(song); - } - getActivity().unbindService(connection); - } - - class SeekBarThread implements Runnable { @Override public void run() { @@ -237,4 +231,14 @@ public class LocalMusicFragment extends Fragment implements ILocalMusicContract. } } } + + class SongChangeReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + Log.d(TAG, "onReceive: songchange"); + songAdapter.notifyDataSetChanged(); + } + } + } diff --git a/app/src/main/java/com/example/musicplayer/view/MainActivity.java b/app/src/main/java/com/example/musicplayer/view/MainActivity.java index 8cc58e0..2f30f07 100644 --- a/app/src/main/java/com/example/musicplayer/view/MainActivity.java +++ b/app/src/main/java/com/example/musicplayer/view/MainActivity.java @@ -1,9 +1,11 @@ package com.example.musicplayer.view; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.ServiceConnection; import android.media.MediaPlayer; import android.os.IBinder; @@ -14,6 +16,7 @@ import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.TextView; @@ -24,14 +27,14 @@ import com.example.musicplayer.service.PlayerService; import com.example.musicplayer.util.FileHelper; public class MainActivity extends AppCompatActivity { - private static final String TAG="MainActivity"; + private static final String TAG = "MainActivity"; private boolean isChange; //拖动进度条 private boolean isSeek;//标记是否在暂停的时候拖动进度条 private boolean flag; //用做暂停的标记 private int time; //记录暂停的时间 private Button mPlayerBtn; - + private ImageView mNextIv; private TextView mSongNameTv; private TextView mSingerTv; private Song mSong; @@ -40,6 +43,9 @@ public class MainActivity extends AppCompatActivity { private SeekBar mSeekBar; private Thread mSeekBarThread; private PlayerService.PlayStatusBinder mPlayStatusBinder; + //注册广播 + private IntentFilter intentFilter; + private SongChangeReceiver songChangeReceiver; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { @@ -49,25 +55,32 @@ public class MainActivity extends AppCompatActivity { @Override public void onServiceDisconnected(ComponentName name) { + } }; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + intentFilter = new IntentFilter(); + intentFilter.addAction("android.song.change"); + songChangeReceiver = new SongChangeReceiver(); + registerReceiver(songChangeReceiver, intentFilter); initView(); onClick(); } - private void initView(){ - mSong= FileHelper.getSong(); - mSongNameTv=findViewById(R.id.tv_song_name); - mSingerTv=findViewById(R.id.tv_singer); - mLinear=findViewById(R.id.linear_player); - mSeekBar = findViewById(R.id.sb_progress); + private void initView() { + mSong = FileHelper.getSong(); + mSongNameTv = findViewById(R.id.tv_song_name); + mSingerTv = findViewById(R.id.tv_singer); + mLinear = findViewById(R.id.linear_player); + mSeekBar = findViewById(R.id.sb_progress); + mNextIv = findViewById(R.id.song_next); - if(mSong.getTitle()!=null){ + if (mSong.getTitle() != null) { //启动服务 Intent playIntent = new Intent(MainActivity.this, PlayerService.class); bindService(playIntent, connection, Context.BIND_AUTO_CREATE); @@ -76,18 +89,18 @@ public class MainActivity extends AppCompatActivity { mLinear.setVisibility(View.VISIBLE); mSongNameTv.setText(mSong.getTitle()); mSingerTv.setText(mSong.getArtist()); - mSeekBar.setMax((int)mSong.getDuration()); - mSeekBar.setProgress((int)mSong.getCurrentTime()); + mSeekBar.setMax((int) mSong.getDuration()); + mSeekBar.setProgress((int) mSong.getCurrentTime()); - }else { + } else { mLinear.setVisibility(View.GONE); } - mPlayerBtn=findViewById(R.id.btn_player); + mPlayerBtn = findViewById(R.id.btn_player); addMainFragment(); } - private void onClick(){ + private void onClick() { //进度条的监听事件 mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override @@ -137,36 +150,54 @@ public class MainActivity extends AppCompatActivity { mSeekBarThread = new Thread(new SeekBarThread()); mSeekBarThread.start(); } else { - mMediaPlayer=mPlayStatusBinder.getMediaPlayer(); - mPlayStatusBinder.play((int)mSong.getCurrentTime()); + mMediaPlayer = mPlayStatusBinder.getMediaPlayer(); + mPlayStatusBinder.play(0); + mMediaPlayer.seekTo((int) mSong.getCurrentTime()); mPlayerBtn.setSelected(true); mSeekBarThread = new Thread(new SeekBarThread()); mSeekBarThread.start(); } } }); + mNextIv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mPlayStatusBinder.next(); + if (mPlayStatusBinder.isPlaying()) { + mPlayerBtn.setSelected(true); + } else { + mPlayerBtn.setSelected(false); + } + } + }); } - private void addMainFragment(){ - MainFragment mainFragment=new MainFragment(); - FragmentManager fragmentManager=getSupportFragmentManager(); - FragmentTransaction transaction=fragmentManager.beginTransaction(); - transaction.addToBackStack(null); - transaction.add(R.id.fragment_container,mainFragment); + private void addMainFragment() { + MainFragment mainFragment = new MainFragment(); + FragmentManager fragmentManager = getSupportFragmentManager(); + FragmentTransaction transaction = fragmentManager.beginTransaction(); + transaction.add(R.id.fragment_container, mainFragment); transaction.commit(); } + @Override - public void onDestroy(){ + public void onDestroy() { + unbindService(connection); + unregisterReceiver(songChangeReceiver); + Song song = FileHelper.getSong(); + song.setCurrentTime(mPlayStatusBinder.getCurrentTime()); + Log.d(TAG, "onServiceDisconnected: " + song.getCurrentTime()); + FileHelper.saveSong(song); super.onDestroy(); - unbindService(connection); - Log.d(TAG, "-----onDestroy: "); + } + class SeekBarThread implements Runnable { @Override public void run() { while (!isChange && mPlayStatusBinder.isPlaying()) { - mSeekBar.setProgress(mMediaPlayer.getCurrentPosition()); + mSeekBar.setProgress((int) mPlayStatusBinder.getCurrentTime()); try { Thread.sleep(1000); } catch (InterruptedException e) { @@ -177,4 +208,16 @@ public class MainActivity extends AppCompatActivity { } + class SongChangeReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + mSong = FileHelper.getSong(); + mSongNameTv.setText(mSong.getTitle()); + mSingerTv.setText(mSong.getArtist()); + mSeekBar.setMax((int) mSong.getDuration()); + mSeekBarThread = new Thread(new SeekBarThread()); + mSeekBarThread.start(); + } + } } diff --git a/app/src/main/java/com/example/musicplayer/view/MainFragment.java b/app/src/main/java/com/example/musicplayer/view/MainFragment.java index 4a8100a..e783a2d 100644 --- a/app/src/main/java/com/example/musicplayer/view/MainFragment.java +++ b/app/src/main/java/com/example/musicplayer/view/MainFragment.java @@ -79,18 +79,11 @@ public class MainFragment extends Fragment { FragmentTransaction transaction = fragmentManager.beginTransaction(); if (mLocalMusicFragment == null) { mLocalMusicFragment = new LocalMusicFragment(); - Log.d(TAG, "replaceFragment: "); - } - //进入和退出动画 transaction.setCustomAnimations(R.anim.fragment_in, R.anim.fragment_out, R.anim.slide_in_right, R.anim.slide_out_right); transaction.hide(this); - if (!mLocalMusicFragment.isAdded()) { - transaction.add(R.id.fragment_container, mLocalMusicFragment); - }else{ - transaction.show(mLocalMusicFragment); - } + transaction.add(R.id.fragment_container, mLocalMusicFragment); //将事务提交到返回栈 transaction.addToBackStack(null);