MainMusicActivity.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. package com.usoftchina.pay;
  2. import android.app.Service;
  3. import android.content.BroadcastReceiver;
  4. import android.content.ComponentName;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.content.IntentFilter;
  8. import android.content.ServiceConnection;
  9. import android.media.MediaPlayer;
  10. import android.media.MediaPlayer.OnCompletionListener;
  11. import android.os.Bundle;
  12. import android.os.Handler;
  13. import android.os.IBinder;
  14. import android.support.v7.app.AppCompatActivity;
  15. import android.support.v7.widget.Toolbar;
  16. import android.telephony.TelephonyManager;
  17. import android.util.Log;
  18. import android.view.KeyEvent;
  19. import android.view.LayoutInflater;
  20. import android.view.View;
  21. import android.view.View.OnClickListener;
  22. import android.widget.Button;
  23. import android.widget.SeekBar;
  24. import android.widget.SeekBar.OnSeekBarChangeListener;
  25. import android.widget.TextView;
  26. import android.widget.Toast;
  27. import com.common.LogUtil;
  28. import com.core.utils.StatusBarUtil;
  29. import com.lg.lrcview_master.DefaultLrcParser;
  30. import com.lg.lrcview_master.LrcRow;
  31. import com.lg.lrcview_master.LrcView.OnLrcClickListener;
  32. import com.lg.lrcview_master.LrcView.OnSeekToListener;
  33. import com.usoftchina.music.MusicService;
  34. import com.usoftchina.music.R;
  35. import java.io.BufferedReader;
  36. import java.io.IOException;
  37. import java.io.InputStream;
  38. import java.io.InputStreamReader;
  39. import java.util.List;
  40. public class MainMusicActivity extends AppCompatActivity {
  41. private MediaPlayer mPlayer;
  42. private SeekBar mPlayerSeekBar;
  43. private SeekBar mLrcSeekBar;
  44. private Button mPlayBtn;
  45. private com.lg.lrcview_master.LrcView mLrcView;
  46. private TextView tv_timeStart;
  47. private TextView tv_timeTotal;
  48. PhoneBroadcastReceiver phoneBroadcastReceiver;
  49. private Toast mPlayerToast;
  50. private Toast mLrcToast;
  51. private Toolbar toolbar;
  52. private MusicService musicService;
  53. private static final String TAG = "MainMusicActivity";
  54. // 在Activity中调用 bindService 保持与 Service 的通信
  55. private void bindServiceConnection() {
  56. LogUtil.d(TAG,"bindServiceConnection()");
  57. Intent intent = new Intent(MainMusicActivity.this, MusicService.class);
  58. // startService(intent);
  59. bindService(intent, serviceConnection, this.BIND_AUTO_CREATE);
  60. }
  61. // 回调onServiceConnected 函数,通过IBinder 获取 Service对象,实现Activity与 Service的绑定
  62. private ServiceConnection serviceConnection = new ServiceConnection() {
  63. @Override
  64. public void onServiceConnected(ComponentName name, IBinder service) {
  65. LogUtil.d(TAG,"onServiceConnected()");
  66. musicService = ((MusicService.MyBinder) (service)).getService();
  67. LogUtil.d(TAG,"musicService"+musicService.mediaPlayer);
  68. musicService.mediaPlayer.setOnCompletionListener(onCompletionListener);
  69. if (!musicService.mediaPlayer.isPlaying()){
  70. new Handler().postDelayed(new Runnable() {
  71. @Override
  72. public void run() {
  73. float scalingFactor = com.lg.lrcview_master.LrcView.MIN_SCALING_FACTOR + 0*(com.lg.lrcview_master.LrcView.MAX_SCALING_FACTOR- com.lg.lrcview_master.LrcView.MIN_SCALING_FACTOR)/100;
  74. LogUtil.d("MusicApp","scalingFactor:"+scalingFactor+"");
  75. mLrcView.setLrcScalingFactor(scalingFactor);
  76. musicService.playOrPause();
  77. mLrcView.setLrcRows(getLrcRows());
  78. handler.sendEmptyMessage(0);
  79. mPlayBtn.setText("暂停");
  80. mPlayBtn.setSelected(true);
  81. }
  82. },1000);
  83. }
  84. //musicTotal.setText(time.format(musicService.mediaPlayer.getDuration()));
  85. }
  86. @Override
  87. public void onServiceDisconnected(ComponentName name) {
  88. musicService = null;
  89. }
  90. };
  91. @Override
  92. protected void onCreate(Bundle savedInstanceState) {
  93. super.onCreate(savedInstanceState);
  94. LogUtil.d(TAG,"OnCreate()");
  95. setContentView(R.layout.activity_main_music);
  96. initViews();
  97. initPlayer();
  98. phoneBroadcastReceiver=new PhoneBroadcastReceiver();
  99. IntentFilter filter = new IntentFilter();
  100. filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
  101. filter.addAction("android.intent.action.PHONE_STATE");
  102. registerReceiver(phoneBroadcastReceiver, filter);
  103. toolbar=findViewById(R.id.commonToolBar);
  104. StatusBarUtil.immersive(this, 0x00000000, 0.0f);
  105. setSupportActionBar(toolbar);
  106. getSupportActionBar().setDisplayShowTitleEnabled(false);
  107. StatusBarUtil.setPaddingSmart(this, toolbar);
  108. toolbar.setNavigationIcon(R.drawable.back_black);
  109. toolbar.setNavigationOnClickListener(new OnClickListener() {
  110. @Override
  111. public void onClick(View view) {
  112. // onBackPressed();
  113. moveTaskToBack(true);
  114. }
  115. });
  116. }
  117. @Override
  118. protected void onResume() {
  119. super.onResume();
  120. Log.d(TAG,"musicService:"+musicService);
  121. if (musicService!=null){
  122. Log.d(TAG,"musicService mediaPlayer:"+musicService.mediaPlayer);
  123. }
  124. }
  125. private void initViews() {
  126. mLrcView = (com.lg.lrcview_master.LrcView) findViewById(R.id.lrcView);
  127. mLrcView.setOnSeekToListener(onSeekToListener);
  128. mLrcView.setOnLrcClickListener(onLrcClickListener);
  129. tv_timeStart = findViewById(R.id.tv_timeStart);
  130. tv_timeTotal=findViewById(R.id.tv_timeTotal);
  131. mPlayerSeekBar = (SeekBar) findViewById(R.id.include_player_seekbar);
  132. mLrcSeekBar = (SeekBar) findViewById(R.id.include_lrc_seekbar);
  133. mLrcSeekBar.setMax(100);
  134. //为seekbar设置当前的progress
  135. mLrcSeekBar.setOnSeekBarChangeListener(onSeekBarChangeListener);
  136. mPlayBtn = (Button) findViewById(R.id.btnPlay);
  137. mPlayerSeekBar.setOnSeekBarChangeListener(onSeekBarChangeListener);
  138. mPlayBtn.setOnClickListener(onClickListener);
  139. //getCommonToolBar().setBackgroundResource(R.color.transparent);
  140. }
  141. private void initPlayer() {
  142. // mPlayer = MediaPlayer.create(this, R.raw.yingtang);
  143. // mPlayer.setOnCompletionListener(onCompletionListener);
  144. bindServiceConnection();
  145. }
  146. OnCompletionListener onCompletionListener = new OnCompletionListener() {
  147. @Override
  148. public void onCompletion(MediaPlayer mp) {
  149. mPlayBtn.setText("play");
  150. //mPlayBtn.setSelected(false);
  151. mLrcView.reset();
  152. handler.removeMessages(0);
  153. mPlayerSeekBar.setProgress(0);
  154. musicService.mediaPlayer.start();
  155. mLrcView.setLrcRows(getLrcRows());
  156. handler.sendEmptyMessage(0);
  157. mPlayBtn.setText("暂停");
  158. mPlayBtn.setSelected(true);
  159. }
  160. };
  161. OnLrcClickListener onLrcClickListener = new OnLrcClickListener() {
  162. @Override
  163. public void onClick() {
  164. //Toast.makeText(getApplicationContext(), "歌词被点击啦", Toast.LENGTH_SHORT).show();
  165. }
  166. };
  167. OnSeekToListener onSeekToListener = new OnSeekToListener() {
  168. @Override
  169. public void onSeekTo(int progress) {
  170. musicService.mediaPlayer.seekTo(progress);
  171. }
  172. };
  173. Handler handler = new Handler(){
  174. public void handleMessage(android.os.Message msg) {
  175. mPlayerSeekBar.setMax(musicService.mediaPlayer.getDuration());
  176. mPlayerSeekBar.setProgress(musicService.mediaPlayer.getCurrentPosition());
  177. handler.sendEmptyMessageDelayed(0, 100);
  178. };
  179. };
  180. OnClickListener onClickListener = new OnClickListener() {
  181. @Override
  182. public void onClick(View v) {
  183. if(v == mPlayBtn){
  184. if("play".equals(mPlayBtn.getText())){
  185. musicService.playOrPause();
  186. mLrcView.setLrcRows(getLrcRows());
  187. handler.sendEmptyMessage(0);
  188. mPlayBtn.setText("暂停");
  189. mPlayBtn.setSelected(true);
  190. }else{
  191. if(musicService.mediaPlayer.isPlaying()){
  192. musicService.playOrPause();
  193. mPlayBtn.setText("播放");
  194. mPlayBtn.setSelected(false);
  195. }else{
  196. mPlayBtn.setSelected(true);
  197. musicService.playOrPause();
  198. mPlayBtn.setText("暂停");
  199. }
  200. }
  201. }
  202. }
  203. };
  204. OnSeekBarChangeListener onSeekBarChangeListener = new OnSeekBarChangeListener() {
  205. @Override
  206. public void onStopTrackingTouch(SeekBar seekBar) {
  207. if(seekBar == mPlayerSeekBar){
  208. musicService.mediaPlayer.seekTo(seekBar.getProgress());
  209. handler.sendEmptyMessageDelayed(0, 100);
  210. }
  211. }
  212. @Override
  213. public void onStartTrackingTouch(SeekBar seekBar) {
  214. if(seekBar == mPlayerSeekBar){
  215. handler.removeMessages(0);
  216. }
  217. }
  218. @Override
  219. public void onProgressChanged(SeekBar seekBar, int progress,
  220. boolean fromUser) {
  221. try {
  222. if(seekBar == mPlayerSeekBar){
  223. mLrcView.seekTo(progress, true,fromUser);
  224. // Log.d("timeStr",mLrcView.getmLrcRows().get(0).getTime()+"");
  225. Log.d("timeStrA",progress+"");
  226. tv_timeStart.setText(formatTimeFromProgress(progress));
  227. tv_timeTotal.setText(formatTimeFromProgress(musicService.mediaPlayer.getDuration()));
  228. if(fromUser){
  229. showPlayerToast(formatTimeFromProgress(progress));
  230. }
  231. }else if(seekBar == mLrcSeekBar){
  232. float scalingFactor = com.lg.lrcview_master.LrcView.MIN_SCALING_FACTOR + progress*(com.lg.lrcview_master.LrcView.MAX_SCALING_FACTOR- com.lg.lrcview_master.LrcView.MIN_SCALING_FACTOR)/100;
  233. mLrcView.setLrcScalingFactor(scalingFactor);
  234. showLrcToast((int)(scalingFactor*100)+"%");
  235. }
  236. } catch (Exception e) {
  237. e.printStackTrace();
  238. }
  239. }
  240. };
  241. /**
  242. * 将播放进度的毫米数转换成时间格式
  243. * 如 3000 --> 00:03
  244. * @param progress
  245. * @return
  246. */
  247. private String formatTimeFromProgress(int progress){
  248. //总的秒数
  249. int msecTotal = progress/1000;
  250. int min = msecTotal/60;
  251. int msec = msecTotal%60;
  252. String minStr = min < 10 ? "0"+min:""+min;
  253. String msecStr = msec < 10 ? "0"+msec:""+msec;
  254. return minStr+":"+msecStr;
  255. }
  256. /**
  257. * 获取歌词List集合
  258. * @return
  259. */
  260. private List<LrcRow> getLrcRows(){
  261. List<LrcRow> rows = null;
  262. InputStream is = getResources().openRawResource(R.raw.yingtanglrc);
  263. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  264. String line ;
  265. StringBuffer sb = new StringBuffer();
  266. try {
  267. while((line = br.readLine()) != null){
  268. sb.append(line+"\n");
  269. }
  270. System.out.println(sb.toString());
  271. rows = DefaultLrcParser.getIstance().getLrcRows(sb.toString());
  272. } catch (IOException e) {
  273. e.printStackTrace();
  274. }
  275. return rows;
  276. }
  277. private TextView mPlayerToastTv;
  278. private void showPlayerToast(String text){
  279. if(mPlayerToast == null){
  280. mPlayerToast = new Toast(this);
  281. mPlayerToastTv = (TextView) LayoutInflater.from(this).inflate(R.layout.toast, null);
  282. mPlayerToast.setView(mPlayerToastTv);
  283. mPlayerToast.setDuration(Toast.LENGTH_SHORT);
  284. }
  285. mPlayerToastTv.setText(text);
  286. mPlayerToast.show();
  287. }
  288. private TextView mLrcToastTv;
  289. private void showLrcToast(String text){
  290. if(mLrcToast == null){
  291. mLrcToast = new Toast(this);
  292. mLrcToastTv = (TextView) LayoutInflater.from(this).inflate(R.layout.toast, null);
  293. mLrcToast.setView(mLrcToastTv);
  294. mLrcToast.setDuration(Toast.LENGTH_SHORT);
  295. }
  296. mLrcToastTv.setText(text);
  297. mLrcToast.show();
  298. }
  299. @Override
  300. protected void onDestroy() {
  301. super.onDestroy();
  302. handler.removeMessages(0);
  303. musicService.mediaPlayer.stop();
  304. musicService.mediaPlayer.release();
  305. musicService.mediaPlayer = null;
  306. mLrcView.reset();
  307. }
  308. @Override
  309. public boolean onKeyDown(int keyCode, KeyEvent event) {
  310. if (keyCode == KeyEvent.KEYCODE_BACK) {
  311. moveTaskToBack(true);
  312. return false;
  313. }
  314. return super.onKeyDown(keyCode, event);
  315. }
  316. class PhoneBroadcastReceiver extends BroadcastReceiver{
  317. @Override
  318. public void onReceive(Context context, Intent intent) {
  319. // 如果是拨打电话
  320. if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
  321. musicService.playOrPause();
  322. //拨打电话会优先,收到此广播. 再收到 android.intent.action.PHONE_STATE 的 TelephonyManager.CALL_STATE_OFFHOOK 状态广播;();
  323. } else {
  324. // 如果是来电
  325. TelephonyManager tManager = (TelephonyManager) context
  326. .getSystemService(Service.TELEPHONY_SERVICE);
  327. //电话的状态
  328. switch (tManager.getCallState()) {
  329. case TelephonyManager.CALL_STATE_RINGING:
  330. //等待接听状态
  331. musicService.playOrPause();
  332. break;
  333. case TelephonyManager.CALL_STATE_OFFHOOK:
  334. //接听状态
  335. break;
  336. case TelephonyManager.CALL_STATE_IDLE:
  337. //挂断状态
  338. musicService.playOrPause();
  339. break;
  340. }
  341. }
  342. }
  343. }
  344. }