【佳語音樂下載】寫這個app完全出於對個人愛好。支持MV播放。
https://gitlab.com/gaopinqiang/checkversion/raw/master/Music_Download.apk
實現的效果如下:
文件存在【內部存儲/Jiayu_Music】中,也可以去其它的播放器去中來聽。喜歡就支持下!
部分代碼片段:
package com.jiayu.music;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import com.jiayu.adapter.LyricListAdapter;
import com.jiayu.bean.Cache;
import com.jiayu.bean.LyricListBean;
import com.jiayu.bean.RecordFileBean;
import com.jiayu.constant.CONSTANT;
import com.jiayu.utils.FileUtils;
import com.jiayu.utils.LogUtils;
import com.jiayu.utils.TranslucentStatusBar;
import com.jiayu.welcome.MyApplication;
public class SongDetailActivity extends BaseActivity {
private static final String TAG = "SongDetailActivity";
private Handler mainHandler;
private Context mainContext;
private TextView tv_song_name;
private TextView tv_singer;
private ImageView iv_singer_info;
private TextView tv_song_lyric;
private ListView lv_song_lyric;
private SeekBar sb;
private Button bt_play_pre;
private Button bt_play_positive;
private Button bt_play_pause;
private Button bt_play_next;
private LyricListAdapter lyricListAdapter;
private ArrayList<LyricListBean> lyricBeanList;
public static final int UPDATE_TITLE = 0;
public static final int UPDATE_SEEKBAR = 1;
private MyHandler myHandler = new MyHandler(this);
public static class MyHandler extends Handler {
private final WeakReference<SongDetailActivity> mActivity;
public MyHandler(SongDetailActivity activity) {
this.mActivity = new WeakReference<SongDetailActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
SongDetailActivity activity = mActivity.get();
switch (msg.what) {
case UPDATE_TITLE:
LogUtils.d(TAG, "更新歌曲信息");
int curPosition = Cache.getCurrentPlayingPosition();
activity.refreshSongInfo(activity.mainActivity.completedRecordBeanList.get(curPosition));
break;
case UPDATE_SEEKBAR:
LogUtils.d(TAG, "更新歌曲信息");
int progress = (int) msg.obj;
activity.setSeekbarProgress(progress);
break;
default:
break;
}
}
}
@Override
public void initView() {
setContentView(R.layout.activity_song_detail);
TranslucentStatusBar.setTranslucentStatusBar(this,CONSTANT.STATUS_BAR_COLOR_SONG_DETAIL);
tv_song_name = (TextView) findViewById(R.id.tv_song_name);
tv_singer = (TextView) findViewById(R.id.tv_singer);
iv_singer_info = (ImageView) findViewById(R.id.iv_singer_info);
tv_song_lyric = (TextView) findViewById(R.id.tv_song_lyric);
lv_song_lyric = (ListView) findViewById(R.id.lv_song_lyric);
sb = (SeekBar) findViewById(R.id.sb);
bt_play_pre = (Button) findViewById(R.id.bt_play_pre);
bt_play_positive = (Button) findViewById(R.id.bt_play_positive);
bt_play_pause = (Button) findViewById(R.id.bt_play_pause);
bt_play_next = (Button) findViewById(R.id.bt_play_next);
}
@Override
public void initListener() {
bt_play_pre.setOnClickListener(this);
bt_play_positive.setOnClickListener(this);
bt_play_pause.setOnClickListener(this);
bt_play_next.setOnClickListener(this);
sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mainActivity.seekTo(sb.getProgress());
refresPlayButton();
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
}
});
}
private RecordFileBean currentPlayingSong ;
private MainActivity mainActivity;
MyApplication myapplication = (MyApplication) getApplication();
@Override
public void initData() {
mainHandler = myapplication.getHandler();
mainContext = myapplication.getMainContext();
if(null != myHandler){
myapplication.setSongDetailHandler(myHandler);
}
WeakReference<MainActivity> activity = new WeakReference<MainActivity>((MainActivity) mainContext);
mainActivity = activity.get();
Intent intent = this.getIntent();
currentPlayingSong = (RecordFileBean) intent.getSerializableExtra("songInfo");
int sbProgress = intent.getIntExtra("progress", 0);
setSeekbarProgress(sbProgress);
LayoutInflater mLi = LayoutInflater.from(this);
lyricBeanList = new ArrayList<>();
lyricListAdapter = new LyricListAdapter(mLi, lyricBeanList);
lv_song_lyric.setAdapter(lyricListAdapter);
refresPlayButton();
refreshSongInfo(currentPlayingSong);
}
private void setSeekbarProgress(int progress){
int defaultProgress = 2;
if(progress>defaultProgress){
sb.setProgress(progress);
}else{
sb.setProgress(defaultProgress);
}
}
private void refreshSongInfo(RecordFileBean songInfo){
String songName = songInfo.getFileName();
String[] split = songName.split("_");
try {
tv_song_name.setText(split[1]);
tv_singer.setText(split[0]);
} catch (Exception e) {
LogUtils.e(TAG, "更新標題出錯");
}
loadSingerInfo(songInfo);
loadLyric(songInfo);
}
//根據播放狀態設置播放暫停的按鈕顯示隱藏
private void refresPlayButton(){
if(Cache.isPlayStatus()){
bt_play_positive.setVisibility(View.INVISIBLE);
bt_play_pause.setVisibility(View.VISIBLE);
}else{
bt_play_positive.setVisibility(View.VISIBLE);
bt_play_pause.setVisibility(View.INVISIBLE);
}
}
private void loadSingerInfo(RecordFileBean songInfo) {
String imagePath = CONSTANT.SONG_IMAGE_DOWNLOAD_FOLDER + songInfo.getFileName() + ".jpg";
File file = new File(imagePath);
if (file.exists()) {
Bitmap bt = BitmapFactory.decodeFile(imagePath);
iv_singer_info.setImageBitmap(bt);
}else{
iv_singer_info.setImageResource(R.drawable.ic_singer_info_default);
}
}
private void loadLyric(RecordFileBean songInfo) {
String filePath = CONSTANT.MUSIC_DOWNLOAD_FOLDER + songInfo.getFileName()+".lrc";
String lyric = FileUtils.readContentFromFile(filePath);
lyricBeanList.clear();
String[] split = lyric.split("\n");
for (String string : split) {
//LogUtils.d(TAG, string);
LyricListBean bean = new LyricListBean();
String s = string.replaceAll("\n", "");
String[] split2 = s.split("]");
if(split2.length>1){
bean.setLyric(split2[1]);
lyricBeanList.add(bean);
}
}
lyricListAdapter.notifyDataSetChanged();
}
@Override
public void processClick(View v) {
switch (v.getId()) {
case R.id.bt_play_pre:
mainActivity.controlPreSong();
// int curP = mainActivity.currentPlayingPosition;
mainHandler.postDelayed(new Runnable() {
@Override
public void run() {
int curPosition = Cache.getCurrentPlayingPosition();
refreshSongInfo(mainActivity.completedRecordBeanList.get(curPosition));
refresPlayButton();
}
}, 100);
break;
case R.id.bt_play_positive:
mainActivity.controlPlay();
refresPlayButton();
break;
case R.id.bt_play_pause:
mainActivity.controlPause();
refresPlayButton();
break;
case R.id.bt_play_next:
mainActivity.controlNextSong();
mainHandler.postDelayed(new Runnable() {
@Override
public void run() {
int curPosition = Cache.getCurrentPlayingPosition();
refreshSongInfo(mainActivity.completedRecordBeanList.get(curPosition));
refresPlayButton();
}
}, 100);
break;
default:
break;
}
}
private void sendMessage(int what){
Message message = new Message();
message.what = what;
mainHandler.sendMessage(message);
}
public void eventBack(View v) {
finish();
}
@Override
public void onBackPressed() {
finish();
}
@Override
protected void onDestroy() {
super.onDestroy();
myapplication.setSongDetailHandler(null);
}
}