diff --git a/app/src/main/java/com/example/musicplayer/adapter/SearchContentAdapter.java b/app/src/main/java/com/example/musicplayer/adapter/SearchContentAdapter.java new file mode 100644 index 0000000..b2d1511 --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/adapter/SearchContentAdapter.java @@ -0,0 +1,73 @@ +package com.example.musicplayer.adapter; + +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.example.musicplayer.R; +import com.example.musicplayer.entiy.SeachSong; + +import java.util.ArrayList; + +/** + * Created by 残渊 on 2018/11/21. + */ + +public class SearchContentAdapter extends RecyclerView.Adapter { + private ArrayList mSongListBeans; + private static ItemClick mItemClick; + + public static void setItemClick(ItemClick itemClick){ + mItemClick = itemClick; + } + + public SearchContentAdapter(ArrayList songListBeans){ + mSongListBeans = songListBeans; + } + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.recycler_song_search_item,parent,false); + ViewHolder viewHolder = new ViewHolder(view); + return viewHolder; + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, final int position) { + SeachSong.DataBean songListBean = mSongListBeans.get(position); + holder.artistTv.setText(songListBean.getSinger()); + holder.titleTv.setText(songListBean.getName()); + holder.mItemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mItemClick.onClick(position); + } + }); + } + + @Override + public int getItemCount() { + return mSongListBeans.size(); + } + + class ViewHolder extends RecyclerView.ViewHolder{ + TextView titleTv; + TextView artistTv; + View mItemView; + + public ViewHolder(View itemView) { + super(itemView); + titleTv = itemView.findViewById(R.id.tv_title); + artistTv = itemView.findViewById(R.id.tv_artist); + mItemView = itemView; + } + } + + public interface ItemClick{ + void onClick(int position); + } +} 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 03da66b..cabc5ac 100644 --- a/app/src/main/java/com/example/musicplayer/adapter/SongAdapter.java +++ b/app/src/main/java/com/example/musicplayer/adapter/SongAdapter.java @@ -34,7 +34,6 @@ public class SongAdapter extends RecyclerView.Adapter { private Context mContext; private int mLastPosition = -1; private int defaultPosition; - private Song song=new Song(); private OnItemClickListener onItemClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener){ @@ -114,6 +113,7 @@ public class SongAdapter extends RecyclerView.Adapter { public void onClick(View v) { Log.d(TAG, "onClick: "+mp3Info.getAlbumId()+"id="+mp3Info.getId()); //将点击的序列化到本地 + Song song=new Song(); song.setArtist(mp3Info.getArtist()); song.setDuration(mp3Info.getDuration()); song.setSize(mp3Info.getSize()); diff --git a/app/src/main/java/com/example/musicplayer/constant/BaseUri.java b/app/src/main/java/com/example/musicplayer/constant/BaseUri.java index 43d800e..874ffb4 100644 --- a/app/src/main/java/com/example/musicplayer/constant/BaseUri.java +++ b/app/src/main/java/com/example/musicplayer/constant/BaseUri.java @@ -7,5 +7,11 @@ package com.example.musicplayer.constant; public class BaseUri { public static String SINGER_URL="http://music.163.com/api/search/get/"; + public static String SEARCH_URL="https://api.bzqll.com/music/netease/"; + + public static String QQ_URL="https://api.bzqll.com/music/tencent/"; + public static String STORAGE_IMG_FILE=MyApplication.getContext().getExternalFilesDir("") + "/yuanmusic/img/"; + + public static final String BASE_API_URL_LASTFM = "http://ws.audioscrobbler.com/2.0/"; } diff --git a/app/src/main/java/com/example/musicplayer/contract/IPlayContract.java b/app/src/main/java/com/example/musicplayer/contract/IPlayContract.java index e99a5e5..25325ad 100644 --- a/app/src/main/java/com/example/musicplayer/contract/IPlayContract.java +++ b/app/src/main/java/com/example/musicplayer/contract/IPlayContract.java @@ -13,6 +13,7 @@ public interface IPlayContract { void getSingerAndLrc();//按钮点击事件,获取封面和歌词 void setSingerImg(String ImgUrl); //将图片设置成背景 void setImgFail(String errorMessage); + void setSearchImg();//设置搜索歌曲的图片 } interface Presenter{ void getSingerImg(String singer); diff --git a/app/src/main/java/com/example/musicplayer/contract/ISearchContentContract.java b/app/src/main/java/com/example/musicplayer/contract/ISearchContentContract.java new file mode 100644 index 0000000..0206ff9 --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/contract/ISearchContentContract.java @@ -0,0 +1,26 @@ +package com.example.musicplayer.contract; + +import com.example.musicplayer.entiy.SeachSong; + +import java.util.ArrayList; + +/** + * Created by 残渊 on 2018/11/21. + */ + +public interface ISearchContentContract { + interface Model{ + void search(String seek); //搜索 + } + + interface View{ + String getSeekContent(); //获得搜索的内容 + void setSongsList(ArrayList songListBeans); //显示歌曲列表 + void showError(); + } + interface Presenter{ + void search(String seek); //搜索 + void searchSuccess(ArrayList songListBeans); //搜索成功 + void searchError(); //搜索失败 + } +} diff --git a/app/src/main/java/com/example/musicplayer/entiy/SeachSong.java b/app/src/main/java/com/example/musicplayer/entiy/SeachSong.java new file mode 100644 index 0000000..1728484 --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/entiy/SeachSong.java @@ -0,0 +1,111 @@ +package com.example.musicplayer.entiy; + +import java.util.List; + +/** + * Created by 残渊 on 2018/11/21. + */ + +public class SeachSong { + + + /** + * result : SUCCESS + * code : 200 + * data : [{"id":"452804665","name":"告白气球","singer":"Mc梦柯","pic":"https://api.bzqll.com/music/netease/pic?id=452804665&key=579621905","lrc":"https://api.bzqll.com/music/netease/lrc?id=452804665&key=579621905","url":"https://api.bzqll.com/music/netease/url?id=452804665&key=579621905"},{"id":"536570450","name":"魔术与歌曲:告白气球","singer":"周杰伦/蔡威泽","pic":"https://api.bzqll.com/music/netease/pic?id=536570450&key=579621905","lrc":"https://api.bzqll.com/music/netease/lrc?id=536570450&key=579621905","url":"https://api.bzqll.com/music/netease/url?id=536570450&key=579621905"},{"id":"864255512","name":"告白气球","singer":"初见","pic":"https://api.bzqll.com/music/netease/pic?id=864255512&key=579621905","lrc":"https://api.bzqll.com/music/netease/lrc?id=864255512&key=579621905","url":"https://api.bzqll.com/music/netease/url?id=864255512&key=579621905"},{"id":"454924401","name":"告白气球","singer":"张穆庭","pic":"https://api.bzqll.com/music/netease/pic?id=454924401&key=579621905","lrc":"https://api.bzqll.com/music/netease/lrc?id=454924401&key=579621905","url":"https://api.bzqll.com/music/netease/url?id=454924401&key=579621905"},{"id":"1301125157","name":"告白气球","singer":"文景熙","pic":"https://api.bzqll.com/music/netease/pic?id=1301125157&key=579621905","lrc":"https://api.bzqll.com/music/netease/lrc?id=1301125157&key=579621905","url":"https://api.bzqll.com/music/netease/url?id=1301125157&key=579621905"},{"id":"1300594463","name":"告白气球","singer":"张阿辉","pic":"https://api.bzqll.com/music/netease/pic?id=1300594463&key=579621905","lrc":"https://api.bzqll.com/music/netease/lrc?id=1300594463&key=579621905","url":"https://api.bzqll.com/music/netease/url?id=1300594463&key=579621905"},{"id":"509726593","name":"告白气球 (卡拉偶客版)","singer":"SNH48","pic":"https://api.bzqll.com/music/netease/pic?id=509726593&key=579621905","lrc":"https://api.bzqll.com/music/netease/lrc?id=509726593&key=579621905","url":"https://api.bzqll.com/music/netease/url?id=509726593&key=579621905"},{"id":"863515406","name":"告白气球","singer":"战小二吖","pic":"https://api.bzqll.com/music/netease/pic?id=863515406&key=579621905","lrc":"https://api.bzqll.com/music/netease/lrc?id=863515406&key=579621905","url":"https://api.bzqll.com/music/netease/url?id=863515406&key=579621905"}] + */ + + private String result; + private int code; + private List data; + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public static class DataBean { + /** + * id : 452804665 + * name : 告白气球 + * singer : Mc梦柯 + * pic : https://api.bzqll.com/music/netease/pic?id=452804665&key=579621905 + * lrc : https://api.bzqll.com/music/netease/lrc?id=452804665&key=579621905 + * url : https://api.bzqll.com/music/netease/url?id=452804665&key=579621905 + */ + + private String id; + private String name; + private String singer; + private String pic; + private String lrc; + private String url; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSinger() { + return singer; + } + + public void setSinger(String singer) { + this.singer = singer; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getLrc() { + return lrc; + } + + public void setLrc(String lrc) { + this.lrc = lrc; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } +} 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 3254e15..5b16d45 100644 --- a/app/src/main/java/com/example/musicplayer/entiy/Song.java +++ b/app/src/main/java/com/example/musicplayer/entiy/Song.java @@ -18,6 +18,7 @@ public class Song implements Serializable { private int current;//在本地音乐的位置 private long albumId; private long id; + private String imgUrl; public long getId() { return id; @@ -91,7 +92,13 @@ public class Song implements Serializable { this.albumId = albumId; } + public String getImgUrl() { + return imgUrl; + } + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } public String toString(){ return "artist="+artist+",title="+title+",url="+url+",duration="+duration+ diff --git a/app/src/main/java/com/example/musicplayer/https/NetWork.java b/app/src/main/java/com/example/musicplayer/https/NetWork.java index e0e58a0..4e5c956 100644 --- a/app/src/main/java/com/example/musicplayer/https/NetWork.java +++ b/app/src/main/java/com/example/musicplayer/https/NetWork.java @@ -1,6 +1,7 @@ package com.example.musicplayer.https; import com.example.musicplayer.constant.BaseUri; +import com.example.musicplayer.https.api.SearchApi; import com.example.musicplayer.https.api.SingerImgApi; import java.util.concurrent.TimeUnit; @@ -12,6 +13,8 @@ import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; +import static com.example.musicplayer.constant.BaseUri.QQ_URL; +import static com.example.musicplayer.constant.BaseUri.SEARCH_URL; import static com.example.musicplayer.constant.BaseUri.SINGER_URL; /** @@ -23,6 +26,7 @@ public class NetWork { private static Converter.Factory gsonConverterFactory = GsonConverterFactory.create(); private static CallAdapter.Factory rxJavaCallAdapterFactory = RxJava2CallAdapterFactory.create(); private static SingerImgApi singerImgApi; + private static SearchApi searchApi; public static SingerImgApi getSingerImgApi(){ if(singerImgApi==null){ @@ -37,5 +41,17 @@ public class NetWork { return singerImgApi; } + public static SearchApi getSearchApi(){ + if(searchApi ==null){ + Retrofit retrofit =new Retrofit.Builder() + .client(builder.build()) + .baseUrl(QQ_URL) + .addCallAdapterFactory(rxJavaCallAdapterFactory) + .addConverterFactory(gsonConverterFactory) + .build(); + searchApi =retrofit.create(SearchApi.class); + } + return searchApi; + } } diff --git a/app/src/main/java/com/example/musicplayer/https/RetrofitHelp.java b/app/src/main/java/com/example/musicplayer/https/RetrofitHelp.java index d18b502..4064204 100644 --- a/app/src/main/java/com/example/musicplayer/https/RetrofitHelp.java +++ b/app/src/main/java/com/example/musicplayer/https/RetrofitHelp.java @@ -1,8 +1,26 @@ package com.example.musicplayer.https; +import java.util.concurrent.TimeUnit; + +import okhttp3.OkHttpClient; +import retrofit2.CallAdapter; +import retrofit2.Converter; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import retrofit2.converter.gson.GsonConverterFactory; + /** * Created by 残渊 on 2018/10/26. */ public class RetrofitHelp { + private static okhttp3.OkHttpClient.Builder builder = new OkHttpClient.Builder().connectTimeout(20, TimeUnit.SECONDS); + private static Converter.Factory gsonConverterFactory = GsonConverterFactory.create(); + private static CallAdapter.Factory rxJavaCallAdapterFactory = RxJava2CallAdapterFactory.create(); + + public RetrofitHelp(){ + + } + public static RetrofitHelp getInstance(){ + return new RetrofitHelp(); + } } diff --git a/app/src/main/java/com/example/musicplayer/https/api/SearchApi.java b/app/src/main/java/com/example/musicplayer/https/api/SearchApi.java new file mode 100644 index 0000000..2b4272e --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/https/api/SearchApi.java @@ -0,0 +1,20 @@ +package com.example.musicplayer.https.api; + +import com.example.musicplayer.entiy.SeachSong; + +import io.reactivex.Observable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Path; +import retrofit2.http.Query; + +/** + * Created by 残渊 on 2018/11/21. + */ + +public interface SearchApi { + @GET("search?key=579621905&type=song&limit=30&offset=0") + Observable search(@Query("s") String seek); +} diff --git a/app/src/main/java/com/example/musicplayer/model/SearchContentModel.java b/app/src/main/java/com/example/musicplayer/model/SearchContentModel.java new file mode 100644 index 0000000..ef121ba --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/model/SearchContentModel.java @@ -0,0 +1,56 @@ +package com.example.musicplayer.model; + +import android.util.Log; + +import com.example.musicplayer.contract.ISearchContentContract; +import com.example.musicplayer.entiy.SeachSong; +import com.example.musicplayer.https.NetWork; + +import java.util.ArrayList; + +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; + +/** + * Created by 残渊 on 2018/11/21. + */ + +public class SearchContentModel implements ISearchContentContract.Model { + private static final String TAG="SearchContentModel"; + private ISearchContentContract.Presenter mPresenter; + + public SearchContentModel(ISearchContentContract.Presenter presenter){ + mPresenter = presenter; + } + + @Override + public void search(String seek) { + NetWork.getSearchApi().search(seek) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(SeachSong value) { + mPresenter.searchSuccess((ArrayList) value.getData()); + } + + @Override + public void onError(Throwable e) { + mPresenter.searchError(); + Log.d(TAG, "onError: "+e.toString()); + } + + @Override + public void onComplete() { + + } + }); + + } +} diff --git a/app/src/main/java/com/example/musicplayer/presenter/SearchContentPresenter.java b/app/src/main/java/com/example/musicplayer/presenter/SearchContentPresenter.java new file mode 100644 index 0000000..ce1014a --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/presenter/SearchContentPresenter.java @@ -0,0 +1,38 @@ +package com.example.musicplayer.presenter; + +import com.example.musicplayer.base.BasePresenter; +import com.example.musicplayer.contract.ISearchContentContract; +import com.example.musicplayer.entiy.SeachSong; +import com.example.musicplayer.model.SearchContentModel; + +import java.util.ArrayList; + +/** + * Created by 残渊 on 2018/11/21. + */ + +public class SearchContentPresenter extends BasePresenter + implements ISearchContentContract.Presenter { + private SearchContentModel mModel; + + public SearchContentPresenter(){ + mModel = new SearchContentModel(this); + } + + @Override + public void search(String seek) { + mModel.search(seek); + } + + @Override + public void searchSuccess(ArrayList songListBeans) { + if(isAttachView()){ + getMvpView().setSongsList(songListBeans); + } + } + + @Override + public void searchError() { + getMvpView().showError(); + } +} 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 8fc886b..02107ea 100644 --- a/app/src/main/java/com/example/musicplayer/service/PlayerService.java +++ b/app/src/main/java/com/example/musicplayer/service/PlayerService.java @@ -45,7 +45,7 @@ public class PlayerService extends Service { mCurrent++; Log.d(TAG, "-------onBind: 结束"); //将歌曲的信息保存起来 - Song song=FileHelper.getSong(); + Song song=new Song(); song.setCurrent(mCurrent); song.setTitle(mMp3InfoList.get(mCurrent).getTitle()); song.setArtist(mMp3InfoList.get(mCurrent).getArtist()); @@ -102,6 +102,22 @@ public class PlayerService extends Service { } } + public void playOnline(){ + try{ + mediaPlayer.reset(); + mediaPlayer.setDataSource(FileHelper.getSong().getUrl()); + mediaPlayer.prepare(); + Song song = FileHelper.getSong(); + song.setDuration(mediaPlayer.getDuration()); + FileHelper.saveSong(song); + isPlaying=true; + mediaPlayer.start(); + sendBroadcast(new Intent("SONG_ONLINE")); + }catch (Exception e){ + e.printStackTrace(); + } + } + /** * 暂停音乐 */ @@ -131,7 +147,7 @@ public class PlayerService extends Service { } //将歌曲的信息保存起来 - Song song=FileHelper.getSong(); + Song song=new Song(); song.setCurrent(mCurrent); song.setTitle(mMp3InfoList.get(mCurrent).getTitle()); song.setArtist(mMp3InfoList.get(mCurrent).getArtist()); @@ -154,7 +170,7 @@ public class PlayerService extends Service { } //将歌曲的信息保存起来 - Song song=FileHelper.getSong(); + Song song=new Song(); song.setCurrent(mCurrent); song.setTitle(mMp3InfoList.get(mCurrent).getTitle()); song.setArtist(mMp3InfoList.get(mCurrent).getArtist()); 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 f2d322f..e8ee200 100644 --- a/app/src/main/java/com/example/musicplayer/view/MainActivity.java +++ b/app/src/main/java/com/example/musicplayer/view/MainActivity.java @@ -25,6 +25,8 @@ import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.TextView; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; import com.example.musicplayer.R; import com.example.musicplayer.constant.PlayerStatus; import com.example.musicplayer.entiy.Song; @@ -79,6 +81,7 @@ public class MainActivity extends AppCompatActivity { intentFilter.addAction("android.song.change"); intentFilter.addAction("SONG_PAUSE"); intentFilter.addAction("SONG_RESUME"); + intentFilter.addAction("SONG_ONLINE"); songChangeReceiver = new SongChangeReceiver(); registerReceiver(songChangeReceiver, intentFilter); initView(); @@ -113,7 +116,15 @@ public class MainActivity extends AppCompatActivity { mSingerTv.setText(mSong.getArtist()); mSeekBar.setMax((int) mSong.getDuration()); mSeekBar.setProgress((int) mSong.getCurrentTime()); - FileHelper.setSingerImg(MainActivity.this,mSong.getArtist(),mCoverIv); + if (mSong.getImgUrl() == null) { + FileHelper.setSingerImg(MainActivity.this, mSong.getArtist(), mCoverIv); + } else { + Glide.with(this) + .load(mSong.getImgUrl()) + .apply(RequestOptions.errorOf(R.drawable.background)) + .into(mCoverIv); + } + } else { mLinear.setVisibility(View.GONE); @@ -175,7 +186,11 @@ public class MainActivity extends AppCompatActivity { mSeekBarThread = new Thread(new SeekBarThread()); mSeekBarThread.start(); } else { - mPlayStatusBinder.play(0); + if (FileHelper.getSong().getImgUrl() != null) { + mPlayStatusBinder.playOnline(); + } else { + mPlayStatusBinder.play(0); + } mMediaPlayer.seekTo((int) mSong.getCurrentTime()); mCircleAnimator.start(); mPlayerBtn.setSelected(true); @@ -204,16 +219,19 @@ public class MainActivity extends AppCompatActivity { //播放情况 if (mPlayStatusBinder.isPlaying()) { - Song song=FileHelper.getSong(); + Song song = FileHelper.getSong(); song.setCurrentTime(mPlayStatusBinder.getCurrentTime()); FileHelper.saveSong(song); toPlayActivityIntent.putExtra(PlayerStatus.PLAYER_STATUS, PlayerStatus.PLAY); - }else{ + } else { //暂停情况 - Song song=FileHelper.getSong(); + Song song = FileHelper.getSong(); song.setCurrentTime(mSeekBar.getProgress()); FileHelper.saveSong(song); } + if(FileHelper.getSong().getImgUrl()!=null){ + toPlayActivityIntent.putExtra(SearchContentFragment.IS_ONLINE,true); + } startActivity(toPlayActivityIntent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle()); } @@ -265,23 +283,38 @@ public class MainActivity extends AppCompatActivity { mSong = FileHelper.getSong(); mSongNameTv.setText(mSong.getTitle()); mSingerTv.setText(mSong.getArtist()); - FileHelper.setSingerImg(MainActivity.this,mSong.getArtist(),mCoverIv); + mSeekBar.setMax((int) mSong.getDuration()); - if(action.equals("SONG_PAUSE")){ - mPlayerBtn.setSelected(false); - mCircleAnimator.pause(); - }else if(action.equals("SONG_RESUME")){ - mPlayerBtn.setSelected(true); - mCircleAnimator.resume(); - mSeekBarThread = new Thread(new SeekBarThread()); - mSeekBarThread.start(); - }else{ + if (!action.equals("SONG_ONLINE")) { + if(mSong.getImgUrl()==null) FileHelper.setSingerImg(MainActivity.this, mSong.getArtist(), mCoverIv); + if (action.equals("SONG_PAUSE")) { + mPlayerBtn.setSelected(false); + mCircleAnimator.pause(); + } else if (action.equals("SONG_RESUME")) { + mPlayerBtn.setSelected(true); + mCircleAnimator.resume(); + mSeekBarThread = new Thread(new SeekBarThread()); + mSeekBarThread.start(); + + } else { + mPlayerBtn.setSelected(true); + mCircleAnimator.start(); + mSeekBarThread = new Thread(new SeekBarThread()); + mSeekBarThread.start(); + } + } else { + Glide.with(MainActivity.this) + .load(mSong.getImgUrl()) + .apply(RequestOptions.errorOf(R.drawable.background)) + .into(mCoverIv); + mPlayerBtn.setSelected(true); mCircleAnimator.start(); mSeekBarThread = new Thread(new SeekBarThread()); mSeekBarThread.start(); + } } } diff --git a/app/src/main/java/com/example/musicplayer/view/PlayActivity.java b/app/src/main/java/com/example/musicplayer/view/PlayActivity.java index 46efec9..57576f8 100644 --- a/app/src/main/java/com/example/musicplayer/view/PlayActivity.java +++ b/app/src/main/java/com/example/musicplayer/view/PlayActivity.java @@ -64,6 +64,8 @@ import java.util.List; public class PlayActivity extends BaseActivity implements IPlayContract.View { private String TAG = "PlayActivity"; + private boolean isOnline; //判断是否为网络歌曲 + private int mPlayStatus; private boolean isChange; //拖动进度条 private boolean isSeek;//标记是否在暂停的时候拖动进度条 @@ -102,6 +104,18 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { @Override public void onServiceConnected(ComponentName name, IBinder service) { mPlayStatusBinder = (PlayerService.PlayStatusBinder) service; + if(isOnline){ + mGetImgAndLrcBtn.setVisibility(View.GONE); + if(mPlayStatus==PlayerStatus.PAUSE) mPlayStatusBinder.playOnline(); + mDurationTimeTv.setText(MediaUtil.formatTime(FileHelper.getSong().getDuration())); + setSingerImg(FileHelper.getSong().getImgUrl()); + mDisc.play(); + mPlayBtn.setSelected(true); + startUpdateSeekBarProgress(); + }else{ + mDurationTimeTv.setText(MediaUtil.formatTime(mSong.getDuration())); + setLocalImg(mSong.getArtist()); + } } @Override @@ -137,10 +151,15 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { //与Presenter建立关系 mPresenter = new PlayPresenter(); mPresenter.attachView(this); + //是否为网络歌曲 + isOnline=getIntent().getBooleanExtra(SearchContentFragment.IS_ONLINE,false); + Log.d(TAG, "isOnline="+isOnline); + mPlayStatus=getIntent().getIntExtra(PlayerStatus.PLAYER_STATUS, 2); //注册广播 mIntentFilter = new IntentFilter(); mIntentFilter.addAction("android.song.change"); + mIntentFilter.addAction("SONG_ONLINE"); songChangeReceiver = new SongChangeReceiver(); registerReceiver(songChangeReceiver, mIntentFilter); @@ -161,28 +180,29 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { mDisc = findViewById(R.id.disc_view); mDiscImg = findViewById(R.id.iv_disc_background); - - //绑定服务 - Intent playIntent = new Intent(PlayActivity.this, PlayerService.class); - bindService(playIntent, connection, Context.BIND_AUTO_CREATE); - mSong = FileHelper.getSong(); mMp3InfoList = MediaUtil.getMp3Info(); mSingerTv.setText(mSong.getArtist()); mSongTv.setText(mSong.getTitle()); mCurrentTimeTv.setText(MediaUtil.formatTime(mSong.getCurrentTime())); - mDurationTimeTv.setText(MediaUtil.formatTime(mSong.getDuration())); mSeekBar.setMax((int) mSong.getDuration()); mSeekBar.setProgress((int) mSong.getCurrentTime()); - setLocalImg(mSong.getArtist()); - if (getIntent().getIntExtra(PlayerStatus.PLAYER_STATUS, 2) == 1) { + + if (mPlayStatus == PlayerStatus.PLAY) { mDisc.play(); mPlayBtn.setSelected(true); startUpdateSeekBarProgress(); } + //绑定服务 + Intent playIntent = new Intent(PlayActivity.this, PlayerService.class); + bindService(playIntent, connection, Context.BIND_AUTO_CREATE); + + + + } private void try2UpdateMusicPicBackground(final Bitmap bitmap) { @@ -344,15 +364,17 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { SimpleTarget target = new SimpleTarget(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) { @Override public void onResourceReady(@Nullable Drawable resource, Transition transition) { - mImgBmp = ((BitmapDrawable) resource).getBitmap(); - //保存图片到本地 - FileHelper.saveImgToNative(PlayActivity.this, mImgBmp, getSingerName()); + //如果是本地音乐 + if(!isOnline){ + //保存图片到本地 + FileHelper.saveImgToNative(PlayActivity.this, mImgBmp, getSingerName()); + CommonUtil.showToast(PlayActivity.this, "获取封面歌词成功"); + } Song song = FileHelper.getSong(); mMp3InfoList.get(song.getCurrent()).setImgSave(true); try2UpdateMusicPicBackground(mImgBmp); setDiscImg(mImgBmp); - CommonUtil.showToast(PlayActivity.this, "获取封面歌词成功"); mGetImgAndLrcBtn.setVisibility(View.GONE); } }; @@ -369,6 +391,11 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { CommonUtil.showToast(this, errorMessage); } + @Override + public void setSearchImg() { + + } + //设置唱碟中歌手头像 private void setDiscImg(Bitmap bitmap) { @@ -386,15 +413,17 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { @Override public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); Song mSong = FileHelper.getSong(); mSongTv.setText(mSong.getTitle()); mSingerTv.setText(mSong.getArtist()); mDurationTimeTv.setText(MediaUtil.formatTime(mSong.getDuration())); mPlayBtn.setSelected(true); - setLocalImg(mSong.getArtist());//显示照片 mSeekBar.setMax((int) mSong.getDuration()); startUpdateSeekBarProgress(); - + if(!action.equals("SONG_ONLINE")){ + setLocalImg(mSong.getArtist());//显示照片 + } } } diff --git a/app/src/main/java/com/example/musicplayer/view/SearchContentFragment.java b/app/src/main/java/com/example/musicplayer/view/SearchContentFragment.java new file mode 100644 index 0000000..7d545ea --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/view/SearchContentFragment.java @@ -0,0 +1,95 @@ +package com.example.musicplayer.view; + +import android.content.Intent; +import android.media.MediaPlayer; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; + +import com.example.musicplayer.R; +import com.example.musicplayer.adapter.SearchContentAdapter; +import com.example.musicplayer.contract.ISearchContentContract; +import com.example.musicplayer.entiy.SeachSong; +import com.example.musicplayer.entiy.Song; +import com.example.musicplayer.presenter.SearchContentPresenter; +import com.example.musicplayer.util.CommonUtil; +import com.example.musicplayer.util.FileHelper; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; + +/** + * Created by 残渊 on 2018/11/21. + */ + +public class SearchContentFragment extends Fragment implements ISearchContentContract.View{ + private static final String TAG="SearchContentFragment"; + public static final String IS_ONLINE="online"; + + private SearchContentPresenter mPresenter; + private RecyclerView mRecycler; + private LinearLayoutManager manager; + private SearchContentAdapter mAdapter; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view=inflater.inflate(R.layout.fragment_search_content,container,false); + return view; + } + + @Override + public void onActivityCreated(Bundle savedInstanceState){ + super.onActivityCreated(savedInstanceState); + mRecycler = getActivity().findViewById(R.id.recycler_song_list); + manager = new LinearLayoutManager(getActivity()); + + mPresenter = new SearchContentPresenter(); + mPresenter.attachView(this); + mPresenter.search(getSeekContent()); + + } + + @Override + public String getSeekContent() { + Log.d(TAG, "getSeekContent: "+getArguments().getString("seek")); + return getArguments().getString("seek").trim(); + } + + @Override + public void setSongsList(final ArrayList songListBeans) { + mAdapter = new SearchContentAdapter(songListBeans); + mRecycler.setLayoutManager(manager); + mRecycler.setAdapter(mAdapter); + + mAdapter.setItemClick(new SearchContentAdapter.ItemClick() { + @Override + public void onClick(int position) { + SeachSong.DataBean dataBean = songListBeans.get(position); + Song song= new Song(); + song.setArtist(dataBean.getSinger()); + song.setTitle(dataBean.getName()); + song.setUrl(dataBean.getUrl()); + song.setImgUrl(dataBean.getPic()); + song.setCurrent(FileHelper.getSong()==null?0:FileHelper.getSong().getCurrent()); + FileHelper.saveSong(song); + + Intent intent=new Intent(getActivity(),PlayActivity.class); + intent.putExtra(IS_ONLINE,true); + startActivity(intent); + } + }); + } + + @Override + public void showError() { + CommonUtil.showToast(getActivity(),"连接超时"); + } +} diff --git a/app/src/main/java/com/example/musicplayer/view/SearchFragment.java b/app/src/main/java/com/example/musicplayer/view/SearchFragment.java index 7a8f1f2..878b112 100644 --- a/app/src/main/java/com/example/musicplayer/view/SearchFragment.java +++ b/app/src/main/java/com/example/musicplayer/view/SearchFragment.java @@ -2,11 +2,14 @@ package com.example.musicplayer.view; import android.os.Bundle; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; +import android.widget.TextView; import com.example.musicplayer.R; import com.example.musicplayer.util.CommonUtil; @@ -16,20 +19,44 @@ import com.example.musicplayer.util.CommonUtil; */ public class SearchFragment extends Fragment { - private static final String TAG="SearchFragment"; + private static final String TAG = "SearchFragment"; private EditText mSeekEdit; + private TextView mSeekTv; + private SearchContentFragment mSearchContentFragment; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view=inflater.inflate(R.layout.fragment_search,container,false); + View view = inflater.inflate(R.layout.fragment_search, container, false); mSeekEdit = view.findViewById(R.id.edit_seek); + mSeekTv = view.findViewById(R.id.tv_search); return view; } + @Override - public void onActivityCreated(Bundle saveInstanceState){ + public void onActivityCreated(Bundle saveInstanceState) { super.onActivityCreated(saveInstanceState); - CommonUtil.showKeyboard(mSeekEdit,getActivity()); - Log.d(TAG, "onActivityCreated: true"); + CommonUtil.showKeyboard(mSeekEdit, getActivity()); + mSeekTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + CommonUtil.closeKeybord(mSeekEdit, getActivity()); + replaceFragment(); + } + }); + } + + //搜索后的页面 + private void replaceFragment() { + + FragmentManager manager = getActivity().getSupportFragmentManager(); + FragmentTransaction transaction = manager.beginTransaction(); + mSearchContentFragment = new SearchContentFragment(); + Bundle bundle = new Bundle(); + Log.d(TAG, "seek:" + mSeekEdit.getText().toString()); + bundle.putString("seek", mSeekEdit.getText().toString()); + mSearchContentFragment.setArguments(bundle); + transaction.replace(R.id.container, mSearchContentFragment); + transaction.commit(); } } diff --git a/app/src/main/res/layout/activity_play.xml b/app/src/main/res/layout/activity_play.xml index 20ec779..abd4f40 100644 --- a/app/src/main/res/layout/activity_play.xml +++ b/app/src/main/res/layout/activity_play.xml @@ -46,7 +46,8 @@ android:layout_height="wrap_content" android:layout_marginTop="5dp" android:ellipsize="end" - android:maxEms="15" + android:singleLine="true" + android:paddingEnd="20dp" android:textColor="@color/white_easy" /> diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index 65da345..b11f715 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -51,5 +51,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_search_content.xml b/app/src/main/res/layout/fragment_search_content.xml new file mode 100644 index 0000000..bdbad2a --- /dev/null +++ b/app/src/main/res/layout/fragment_search_content.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/recycler_song_search_item.xml b/app/src/main/res/layout/recycler_song_search_item.xml new file mode 100644 index 0000000..ff721cc --- /dev/null +++ b/app/src/main/res/layout/recycler_song_search_item.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + \ No newline at end of file