下一首功能,改善了顺序播放的功能,以及增加了当前播放歌曲的定位功能

pull/1/head
jsyjst 7 years ago
parent bf7cdaa90b
commit bbfe46e448

@ -33,6 +33,7 @@
</service>
</application>
</manifest>

@ -26,11 +26,13 @@ import java.util.List;
*/
public class SongAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG="jsyjst";
private int footerViewType = 1;
private int itemViewType = 0;
private List<Mp3Info> 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<RecyclerView.ViewHolder> {
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<RecyclerView.ViewHolder> {
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<RecyclerView.ViewHolder> {
public interface OnItemClickListener{
void onSongClick(int position);
void onSongClick();
}
}

@ -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;
}
}

@ -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<Mp3Info> 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();
}
}

@ -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();
}
}
}

@ -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();
}
}
}

@ -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);

Loading…
Cancel
Save