package com.atguigu.mobileplayer1020.activity;
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.graphics.drawable.AnimationDrawable;
import android.media.audiofx.Visualizer;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import com.atguigu.mobileplayer1020.IMusicPlayerService;
import com.atguigu.mobileplayer1020.R;
import com.atguigu.mobileplayer1020.bean.MediaItem;
import com.atguigu.mobileplayer1020.service.MusicPlayerService;
import com.atguigu.mobileplayer1020.utils.LyricParaser;
import com.atguigu.mobileplayer1020.utils.Utils;
import com.atguigu.mobileplayer1020.view.BaseVisualizerView;
import com.atguigu.mobileplayer1020.view.LyricShowView;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.io.File;
public class SystemAudioPlayerActivity extends AppCompatActivity implements View.OnClickListener {
private ImageView ivIcon;
private TextView tvArtist;
private TextView tvName;
private TextView tvTime;
private SeekBar seekbarAudio;
private Button btnAudioPlaymode;
private Button btnAudioPre;
private Button btnAudioStartPause;
private Button btnAudioNext;
private Button btnSwichLyric;
private int position;
private LyricShowView lyric_show_view;
private BaseVisualizerView baseVisualizerView;
private MyReceiver receiver;
/**
* 进度更新
*/
private static final int PROGRESS = 1;
private static final int SHOW_LYRIC = 2;
private Utils utils;
private boolean notification;
private Visualizer mVisualizer;
/**
* Find the Views in the layout<br />
* <br />
* Auto-created on 2017-01-11 15:19:08 by Android Layout Finder
* (http://www.buzzingandroid.com/tools/android-layout-finder)
*/
private void findViews() {
setContentView(R.layout.activity_system_audio_player);
tvArtist = (TextView) findViewById(R.id.tv_artist);
tvName = (TextView) findViewById(R.id.tv_name);
tvTime = (TextView) findViewById(R.id.tv_time);
seekbarAudio = (SeekBar) findViewById(R.id.seekbar_audio);
btnAudioPlaymode = (Button) findViewById(R.id.btn_audio_playmode);
btnAudioPre = (Button) findViewById(R.id.btn_audio_pre);
btnAudioStartPause = (Button) findViewById(R.id.btn_audio_start_pause);
btnAudioNext = (Button) findViewById(R.id.btn_audio_next);
btnSwichLyric = (Button) findViewById(R.id.btn_swich_lyric);
ivIcon = (ImageView) findViewById(R.id.iv_icon);
lyric_show_view = (LyricShowView) findViewById(R.id.lyric_show_view);
baseVisualizerView = (BaseVisualizerView) findViewById(R.id.baseVisualizerView);
ivIcon.setBackgroundResource(R.drawable.animation_list);
AnimationDrawable drawable = (AnimationDrawable) ivIcon.getBackground();
drawable.start();
btnAudioPlaymode.setOnClickListener(this);
btnAudioPre.setOnClickListener(this);
btnAudioStartPause.setOnClickListener(this);
btnAudioNext.setOnClickListener(this);
btnSwichLyric.setOnClickListener(this);
//设置拖拽监听
seekbarAudio.setOnSeekBarChangeListener(new MyOnSeekBarChangeListener());
}
class MyOnSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
try {
service.seekTo(progress);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
}
@Override
public void onClick(View v) {
if (v == btnAudioPlaymode) {
// Handle clicks for btnAudioPlaymode
changePlaymode();
} else if (v == btnAudioPre) {
// Handle clicks for btnAudioPre
try {
service.pre();
} catch (RemoteException e) {
e.printStackTrace();
}
} else if (v == btnAudioStartPause) {
// Handle clicks for btnAudioStartPause
try {
if (service.isPlaying()) {
//暂停
service.pause();
//按钮状态-设置播放
btnAudioStartPause.setBackgroundResource(R.drawable.btn_audio_start_selector);
} else {
//播放
service.start();
//按钮状态-设置暂停
btnAudioStartPause.setBackgroundResource(R.drawable.btn_audio_pause_selector);
}
} catch (RemoteException e) {
e.printStackTrace();
}
} else if (v == btnAudioNext) {
// Handle clicks for btnAudioNext
try {
service.next();
} catch (RemoteException e) {
e.printStackTrace();
}
} else if (v == btnSwichLyric) {
// Handle clicks for btnSwichLyric
}
}
/**
* 切换模式
*/
private void changePlaymode() {
try {
//得到模式
int playmode = service.getPlayMode();
if (playmode == MusicPlayerService.REPEATE_NOMAL) {
playmode = MusicPlayerService.REPEATE_SINGLE;
} else if (playmode == MusicPlayerService.REPEATE_SINGLE) {
playmode = MusicPlayerService.REPEATE_ALL;
} else if (playmode == MusicPlayerService.REPEATE_ALL) {
playmode = MusicPlayerService.REPEATE_NOMAL;
} else {
playmode = MusicPlayerService.REPEATE_NOMAL;
}
//保存到服务中
service.setPlayMode(playmode);
//校验按钮状态
checkButtonStatu();
} catch (RemoteException e) {
e.printStackTrace();
}
}
private void checkButtonStatu() {
int playmode = 0;
try {
playmode = service.getPlayMode();
if (playmode == MusicPlayerService.REPEATE_NOMAL) {
btnAudioPlaymode.setBackgroundResource(R.drawable.btn_audio_playmode_normal_selector);
} else if (playmode == MusicPlayerService.REPEATE_SINGLE) {
btnAudioPlaymode.setBackgroundResource(R.drawable.btn_audio_playmode_single_selector);
} else if (playmode == MusicPlayerService.REPEATE_ALL) {
btnAudioPlaymode.setBackgroundResource(R.drawable.btn_audio_playmode_all_selector);
} else {
btnAudioPlaymode.setBackgroundResource(R.drawable.btn_audio_playmode_normal_selector);
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
private IMusicPlayerService service;
private ServiceConnection conn = new ServiceConnection() {
/**
* 当连接服务成功后回调
* @param name
* @param iBdinder
*/
@Override
public void onServiceConnected(ComponentName name, IBinder iBdinder) {
service = IMusicPlayerService.Stub.asInterface(iBdinder);
if (service != null) {
//从列表进入
if (!notification) {
try {
//开始播放
service.openAudio(position);
} catch (RemoteException e) {
e.printStackTrace();
}
} else {
//再次显示
showViewData(null);
}
}
}
/**
* 当断开的时候回调
* @param name
*/
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case SHOW_LYRIC://显示歌词
try {
int currentPosition = service.getCurrentPosition();
lyric_show_view.setNextShowLyric(currentPosition);
} catch (RemoteException e) {
e.printStackTrace();
}
removeMessages(SHOW_LYRIC);
sendEmptyMessage(SHOW_LYRIC);
break;
case PROGRESS:
try {
int currentPosition = service.getCurrentPosition();
tvTime.setText(utils.stringForTime(currentPosition) + "/" + utils.stringForTime(service.getDuration()));
//SeekBar进度更新
seekbarAudio.setProgress(currentPosition);
} catch (RemoteException e) {
e.printStackTrace();
}
removeMessages(PROGRESS);
sendEmptyMessageDelayed(PROGRESS, 1000);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initData();
findViews();
getData();
//绑定方式启动服务
startAndBindServide();
}
/**
* 接收广播
*/
private void initData() {
receiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(MusicPlayerService.OPEN_COMPLETE);
registerReceiver(receiver, intentFilter);
utils = new Utils();
//1.注册
EventBus.getDefault().register(this);
}
class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (MusicPlayerService.OPEN_COMPLETE.equals(intent.getAction())) {
showViewData(null);
}
}
}
/**
* 显示视图的数据
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void showViewData(MediaItem mediaItem) {
setupVisualizerFxAndUi();
try {
tvArtist.setText(service.getArtistName());
tvName.setText(service.getAudioName());
//得到总时长
int duration = service.getDuration();
seekbarAudio.setMax(duration);
//更新进度
handler.sendEmptyMessage(PROGRESS);
checkButtonStatu();
String path = service.getAudioPath();//mnt/sdcard/audio/beij.mp3
path = path.substring(0, path.lastIndexOf("."));
File file = new File(path + ".lrc");
if (!file.exists()) {
file = new File(path + ".txt");
}
LyricParaser lyricParaser = new LyricParaser();
//解析歌词
lyricParaser.readFile(file);
if (lyricParaser.isExistsLyric()) {
lyric_show_view.setLyrics(lyricParaser.getLyricBeens());
//歌词同步
handler.sendEmptyMessage(SHOW_LYRIC);
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
/**
* 生成一个VisualizerView对象,使音频频谱的波段能够反映到 VisualizerView上
*/
private void setupVisualizerFxAndUi() {
int audioSessionid = 0;
try {
audioSessionid = service.getAudioSessionId();
} catch (RemoteException e) {
e.printStackTrace();
}
System.out.println("audioSessionid==" + audioSessionid);
mVisualizer = new Visualizer(audioSessionid);
// 参数内必须是2的位数
mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
// 设置允许波形表示,并且捕获它
baseVisualizerView.setVisualizer(mVisualizer);
mVisualizer.setEnabled(true);
}
@Override
protected void onPause() {
super.onPause();
if (isFinishing()) {
mVisualizer.release();
}
}
@Override
protected void onDestroy() {
if (receiver != null) {
unregisterReceiver(receiver);
receiver = null;
}
if (conn != null) {
unbindService(conn);
conn = null;
}
handler.removeCallbacksAndMessages(null);
//2.取消注册
EventBus.getDefault().unregister(this);
super.onDestroy();
}
private void startAndBindServide() {
Intent intent = new Intent(this, MusicPlayerService.class);
//启动服务
startService(intent);//防止服务多次创建
//绑定服务
bindService(intent, conn, Context.BIND_AUTO_CREATE);
}
private void getData() {
//true:从状态栏进入
//false:从ListView中进入
notification = getIntent().getBooleanExtra("notification", false);
if (!notification) {
/**
* 得到播放位置
*/
position = getIntent().getIntExtra("position", 0);
}
}
}