这两个类是此播放器中最重要的实现代码逻辑的两个类,其实代码很简单 只是一些简单的播放器的逻辑实现。

package music.mic.act;

import java.util.List;

import music.mic.mic.Music;
import music.mic.util.LrcView;
import music.mic.util.MusicList;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class MusicActivity extends Activity implements SensorEventListener {
 private TextView textName;
 private TextView textSinger;
 private TextView textStartTime;
 private TextView textEndTime;
 private ImageButton imageBtnLast;
 private ImageButton imageBtnRewind;
 public static ImageButton imageBtnPlay;
 private ImageButton imageBtnForward;
 private ImageButton imageBtnNext;
 private ImageButton imageBtnLoop;
 private ImageButton imageBtnRandom;
  public static LrcView lrc_view;
 private ImageView icon;
 private SeekBar seekBar1;
 private AudioManager audioManager;// 音量管理者
 private int maxVolume;// 最大音量
 private int currentVolume;// 当前音量
 private SeekBar seekBarVolume;
 private List<Music> lists;
 private Boolean isPlaying = false;
 private static int id = 1;
 private static int currentId = 2;
 private static Boolean replaying = false;
 private MyProgressBroadCastReceiver receiver;
 private MyCompletionListner completionListner;
 public static Boolean isLoop = true;
 private SensorManager sensorManager;
 private boolean mRegisteredSensor;

@Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

//第一篇我们已经讲过设置window的属性,以及与setContent顺序问题。这里就不在多说。
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  setContentView(R.layout.music);

//通过id找到所有的控件
  textName = (TextView) this.findViewById(R.id.music_name);
  textSinger = (TextView) this.findViewById(R.id.music_singer);
  textStartTime = (TextView) this.findViewById(R.id.music_start_time);
  textEndTime = (TextView) this.findViewById(R.id.music_end_time);
  seekBar1 = (SeekBar) this.findViewById(R.id.music_seekBar);
  // icon = (ImageView) this.findViewById(R.id.image_icon);
  imageBtnLast = (ImageButton) this.findViewById(R.id.music_lasted);
  imageBtnRewind = (ImageButton) this.findViewById(R.id.music_rewind);
  imageBtnPlay = (ImageButton) this.findViewById(R.id.music_play);
  imageBtnForward = (ImageButton) this.findViewById(R.id.music_foward);
  imageBtnNext = (ImageButton) this.findViewById(R.id.music_next);
  imageBtnLoop = (ImageButton) this.findViewById(R.id.music_loop);
  seekBarVolume = (SeekBar) this.findViewById(R.id.music_volume);
  imageBtnRandom = (ImageButton) this.findViewById(R.id.music_random);
   lrc_view = (LrcView) findViewById(R.id.LyricShow);

//为imageButton设置监听MylIstener()

imageBtnLast.setOnClickListener(new MyListener());
  imageBtnRewind.setOnClickListener(new MyListener());
  imageBtnPlay.setOnClickListener(new MyListener());
  imageBtnForward.setOnClickListener(new MyListener());
  imageBtnNext.setOnClickListener(new MyListener());
  imageBtnLoop.setOnClickListener(new MyListener());
  imageBtnRandom.setOnClickListener(new MyListener());

//设置重力感应这个我没有测试 因为没有真机。。。各位有真机的可以试试

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

//得到歌曲列表

lists = MusicList.getMusicData(this);

//得到AudioManager对象
  audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);// 获得最大音量
  currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);// 获得当前音量

//设置音量
  seekBarVolume.setMax(maxVolume);
  seekBarVolume.setProgress(currentVolume);

//这里的音量也是一个可拖动的进度条,所以要加监听实现功能。
  seekBarVolume.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

@Override
   public void onStopTrackingTouch(SeekBar seekBar) {
    // TODO Auto-generated method stub

}

@Override
   public void onStartTrackingTouch(SeekBar seekBar) {
    // TODO Auto-generated method stub

}

@Override
   public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    // TODO Auto-generated method stub
    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, AudioManager.FLAG_ALLOW_RINGER_MODES);
   }
  });

// 电话状态监听
  TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
  telManager.listen(new MobliePhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE);
  seekBar1.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

@Override
   public void onStopTrackingTouch(SeekBar seekBar) {
    // TODO Auto-generated method stub

seekBar1.setProgress(seekBar.getProgress());
    Intent intent = new Intent("music.mic.seekBar");
    intent.putExtra("seekBarPosition", seekBar.getProgress());
    // System.out.println("==========="+seekBar.getProgress());
    sendBroadcast(intent);

}

@Override
   public void onStartTrackingTouch(SeekBar seekBar) {
    // TODO Auto-generated method stub

}

@Override
   public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    // TODO Auto-generated method stub

}
  });
  completionListner = new MyCompletionListner();
  IntentFilter filter = new IntentFilter("music.mic.completion");

//注册广播接收器
  this.registerReceiver(completionListner, filter);
 }

private class MobliePhoneStateListener extends PhoneStateListener {

@Override
  public void onCallStateChanged(int state, String incomingNumber) {
   switch (state) {
   case TelephonyManager.CALL_STATE_IDLE: /* 无任何状态时 */
    Intent intent = new Intent(MusicActivity.this, MusicService.class);
    intent.putExtra("play", "playing");
    intent.putExtra("id", id);
    startService(intent);
    isPlaying = true;
    imageBtnPlay.setImageResource(R.drawable.pause1);
    replaying = true;
    break;
   case TelephonyManager.CALL_STATE_OFFHOOK: /* 接起电话时 */

case TelephonyManager.CALL_STATE_RINGING: /* 电话进来时 */
    Intent intent2 = new Intent(MusicActivity.this, MusicService.class);
    intent2.putExtra("play", "pause");
    startService(intent2);
    isPlaying = false;
    imageBtnPlay.setImageResource(R.drawable.play1);
    replaying = false;
    break;
   default:
    break;

}

}

}

//以下是一个Activity每个生命周期的每个阶段内处理的函数

@Override
 protected void onStart() {
  // TODO Auto-generated method stub
  super.onStart();
  receiver = new MyProgressBroadCastReceiver();
  IntentFilter filter = new IntentFilter("music.mic.progress");
  this.registerReceiver(receiver, filter);

id = getIntent().getIntExtra("id", 1);
  if (id == currentId) {
   Music m = lists.get(id);
   textName.setText(m.getTitle());
   textSinger.setText(m.getSinger());
   textEndTime.setText(toTime((int) m.getTime()));

//通过Intent将参数等传递到Service中进行处理
   Intent intent = new Intent(MusicActivity.this, MusicService.class);
   intent.putExtra("play", "replaying");
   intent.putExtra("id", id);
   startService(intent);
   if (replaying == true) {
    imageBtnPlay.setImageResource(R.drawable.pause1);
    // /replaying=false;
    isPlaying = true;
   } else {
    imageBtnPlay.setImageResource(R.drawable.play1);
    // replaying=true;
    isPlaying = false;
   }

} else {
   Music m = lists.get(id);
   textName.setText(m.getTitle());
   textSinger.setText(m.getSinger());
   textEndTime.setText(toTime((int) m.getTime()));
   imageBtnPlay.setImageResource(R.drawable.pause1);
   Intent intent = new Intent(MusicActivity.this, MusicService.class);
   intent.putExtra("play", "play");
   intent.putExtra("id", id);
   startService(intent);
   isPlaying = true;
   replaying = true;
   currentId = id;
  }

}

//重力感应

@Override
 protected void onResume() {
  // TODO Auto-generated method stub
  super.onResume();
  List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
  if (sensors.size() > 0) {
   Sensor sensor = sensors.get(0);
   mRegisteredSensor = sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST);
   Log.e("--------------", sensor.getName());
  }
 }

@Override
 protected void onPause() {
  // TODO Auto-generated method stub
  if (mRegisteredSensor) {
   sensorManager.unregisterListener(this);
   mRegisteredSensor = false;
  }
  super.onPause();
 }

@Override
 protected void onDestroy() {
  // TODO Auto-generated method stub
  this.unregisterReceiver(receiver);
  this.unregisterReceiver(completionListner);
  super.onDestroy();
 }

//广播接收器

public class MyProgressBroadCastReceiver extends BroadcastReceiver {

@Override
  public void onReceive(Context context, Intent intent) {
   // TODO Auto-generated method stub
   int position = intent.getIntExtra("position", 0);
   int total = intent.getIntExtra("total", 0);
   int progress = position * 100 / total;
   textStartTime.setText(toTime(position));
   seekBar1.setProgress(progress);
   seekBar1.invalidate();
  }
 }

//按钮监听实现分别对不同的按钮进行设置监听方法 ,这里唯一需要注意就是上一首,下一首的逻辑判断 也非常简单。

private class MyListener implements OnClickListener {

public void onClick(View v) {
   if (v == imageBtnLast) {
    // 第一首
    id = 0;
    Music m = lists.get(0);
    textName.setText(m.getTitle());
    textSinger.setText(m.getSinger());
    textEndTime.setText(toTime((int) m.getTime()));
    imageBtnPlay.setImageResource(R.drawable.pause1);
    Intent intent = new Intent(MusicActivity.this, MusicService.class);
    intent.putExtra("play", "first");
    intent.putExtra("id", id);
    startService(intent);
    isPlaying = true;
   } else if (v == imageBtnRewind) {
    // 前一首
    int id = MusicService._id - 1;
    if (id >= lists.size() - 1) {
     id = lists.size() - 1;
    } else if (id <= 0) {
     id = 0;
    }
    Music m = lists.get(id);
    textName.setText(m.getTitle());
    textSinger.setText(m.getSinger());
    textEndTime.setText(toTime((int) m.getTime()));
    imageBtnPlay.setImageResource(R.drawable.pause1);
    Intent intent = new Intent(MusicActivity.this, MusicService.class);
    intent.putExtra("play", "rewind");
    intent.putExtra("id", id);
    startService(intent);
    isPlaying = true;
   } else if (v == imageBtnPlay) {
    // 正在播放
    if (isPlaying == true) {
     Intent intent = new Intent(MusicActivity.this, MusicService.class);
     intent.putExtra("play", "pause");
     startService(intent);
     isPlaying = false;
     imageBtnPlay.setImageResource(R.drawable.play1);
     replaying = false;
    } else {
     Intent intent = new Intent(MusicActivity.this, MusicService.class);
     intent.putExtra("play", "playing");
     intent.putExtra("id", id);
     startService(intent);
     isPlaying = true;
     imageBtnPlay.setImageResource(R.drawable.pause1);
     replaying = true;
    }
   } else if (v == imageBtnForward) {
    // 下一首
    int id = MusicService._id + 1;
    if (id >= lists.size() - 1) {
     id = lists.size() - 1;
    } else if (id <= 0) {
     id = 0;
    }
    Music m = lists.get(id);
    textName.setText(m.getTitle());
    textSinger.setText(m.getSinger());
    textEndTime.setText(toTime((int) m.getTime()));
    imageBtnPlay.setImageResource(R.drawable.pause1);
    Intent intent = new Intent(MusicActivity.this, MusicService.class);
    intent.putExtra("play", "forward");
    intent.putExtra("id", id);
    startService(intent);
    isPlaying = true;
   } else if (v == imageBtnNext) {
    // 最后一首
    int id = lists.size() - 1;
    Music m = lists.get(id);
    textName.setText(m.getTitle());
    textSinger.setText(m.getSinger());
    textEndTime.setText(toTime((int) m.getTime()));
    imageBtnPlay.setImageResource(R.drawable.pause1);
    Intent intent = new Intent(MusicActivity.this, MusicService.class);
    intent.putExtra("play", "last");
    intent.putExtra("id", id);
    startService(intent);
    isPlaying = true;
   } else if (v == imageBtnLoop) {
    if (isLoop == true) {
     // 顺序播放
     imageBtnLoop.setBackgroundResource(R.drawable.play_loop_spec);
     isLoop = false;
    } else {
     // 单曲播放
     imageBtnLoop.setBackgroundResource(R.drawable.play_loop_sel);
     isLoop = true;
    }
   } else if (v == imageBtnRandom) {
    imageBtnRandom.setImageResource(R.drawable.play_random_sel);
   }

}

}

private class MyCompletionListner extends BroadcastReceiver {

@Override
  public void onReceive(Context context, Intent intent) {
   // TODO Auto-generated method stub
   Music m = lists.get(MusicService._id);
   textName.setText(m.getTitle());
   textSinger.setText(m.getSinger());
   textEndTime.setText(toTime((int) m.getTime()));
   imageBtnPlay.setImageResource(R.drawable.pause1);
  }

}

public String toTime(int time) {
  time /= 1000;
  int minute = time / 60;
  int hour = minute / 60;
  int second = time % 60;
  return String.format("%02d:%02d", minute, second);
 }

// 重力感应 甩歌代码
 private static final int SHAKE_THRESHOLD = 3000;
 private long lastUpdate = 0;
 private double last_x = 0;
 private double last_y = 4.50;
 private double last_z = 9.50;

// 这个控制精度,越小表示反应越灵敏
 @Override
 public void onAccuracyChanged(Sensor sensor, int accuracy) {
  // TODO Auto-generated method stub
  // 处理精准度改变
 }

@Override
 public void onSensorChanged(SensorEvent event) {
  // TODO Auto-generated method stub
  if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
   long curTime = System.currentTimeMillis();

// 每200毫秒检测一次
   if ((curTime - lastUpdate) > 100) {
    long diffTime = (curTime - lastUpdate);
    lastUpdate = curTime;
    double x = event.values[SensorManager.DATA_X];
    double y = event.values[SensorManager.DATA_Y];
    double z = event.values[SensorManager.DATA_Z];
    Log.e("---------------", "x=" + x + "   y=" + y + "   z=" + z);
    float speed = (float) (Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000);
    if (speed > SHAKE_THRESHOLD) {
     // 检测到摇晃后执行的代码
     if (MusicService.playing == true) {
      Intent intent = new Intent(MusicActivity.this, MusicService.class);
      intent.putExtra("play", "pause");
      startService(intent);
      isPlaying = false;
      imageBtnPlay.setImageResource(R.drawable.play1);
      replaying = false;
     } else {
      Intent intent = new Intent(MusicActivity.this, MusicService.class);
      intent.putExtra("play", "playing");
      intent.putExtra("id", id);
      startService(intent);
      isPlaying = true;
      imageBtnPlay.setImageResource(R.drawable.pause1);
      replaying = true;
     }
    }
    last_x = x;
    last_y = y;
    last_z = z;
   }
  }
 }
}

Android MP3播放器实例--------MusicActivity类以及MusicService类详细讲解相关推荐

  1. android播放器实例,android音乐播放器实例

    郑州app开发android音乐播放器实例.布局代码是一个imagebutton和seekbar. 下面是java代码 MainActivity.java package cn.xhhkj.music ...

  2. sony android mp3播放器,高音质与流媒体兼具,索尼 NW-ZX500 安卓音乐播放器评测

    原标题:高音质与流媒体兼具,索尼 NW-ZX500 安卓音乐播放器评测 用传统的音乐播放器来听歌,似乎已经逐渐变成了一个相对小众的需求. 在我眼里,曾被称呼为「随身听」的音乐播放器,已经逐渐被归类为如 ...

  3. sony android mp3播放器,入手一年,详细聊聊 索尼ZX505、艾利和SR15 两款安卓播放器的使用体验...

    入手一年,详细聊聊 索尼ZX505.艾利和SR15 两款安卓播放器的使用体验 2020-12-04 16:00:21 113点赞 179收藏 28评论 创作立场声明:本文所测商品为自费购入.如参加张大 ...

  4. Android Mp3播放器核心功能服务

    步骤简明详细,一看就懂,代码齐全,复制可用 开发工具为:Android Studio 看图便知功能 看代码便知详情 第一步:设置布局 <?xml version="1.0" ...

  5. android mp3播放器学习之预备知识1:activity

    对应的MP3源码下载:http://download.csdn.net/detail/brightshadow11111/4971610 学习android毋庸置疑,activity是相当相当重要的一 ...

  6. android MP3播放器(支持歌词滚动等功能)

    大二课余时间写的音乐播放器,发现目前网上很多android播放器都缺胳膊少腿的, 于是便分享出来给才接触android的同学作参考,(Tomcat服务器功能已删除) 实现了启动动画,引导界面,appw ...

  7. 我的Android进阶之旅------Android MediaPlayer播放网络音频的实例--网络mp3播放器

    上一篇写了个简单的MP3播放器 ,这次写一个可以播放网络音频资源的播放器 本实例可以实现音乐播放器除了来电的时候会暂停播放,通话结束后恢复播放外,打开其他的Activity都可以继续播放音乐,享受一边 ...

  8. 我的Android进阶之旅------Android MediaPlayer播放mp3的实例--简易mp3播放器

    大家好我们今天研究的是Android中很重要也最为复杂的媒体播放器---MediaPlayer. Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上 ...

  9. Android音乐播放器的开发实例(2021新版-Java版)

    Android音乐播放器的开发实例 介绍 该项目旨在引导喜爱 Android 开发爱好者入门教程实例,可以一步一步的跟着来完成属于自己的项目开发过程. 此项目为基于 Java 语言开发,使用 Recy ...

最新文章

  1. 修复mysql数据库供应商_修复MYSQL数据库
  2. string和stringstream用法总结
  3. Azkaban的Web Server源码探究系列20:resolvebuildFlow
  4. Pandas库学习笔记
  5. Cloud for Customer Mashup debug in IFrame
  6. oracle查询哪些数据未压缩,求助大佬:向压缩表插入数据,压缩未生效
  7. 8.仿阿里云虚拟云服务器的FTP(包括FTP文件夹大小限制)
  8. Linux有问必答:如何查看Linux上程序或进程用到的库
  9. 虚短”“虚断”两板斧,搞定运算放大器 11张大图详(转)感觉特别有用 转过来收藏...
  10. 耐克官网一直显示无法连接服务器,nikeapp无法连接服务器是什么原因 nikeapp怎么抢鞋子...
  11. 你知道腾讯程序员一年写多少代码嘛?
  12. OpenJ_Bailian - 2711
  13. 使用组件不渲染 Unknown custom element: <xxx> - did you register the component correctly? For recursiv
  14. python机器学习基础05——sklearn之逻辑回归+分类评价指标
  15. AlphaFold2源码解析(9)--模型之损失
  16. linux 编译c文件 arm,用arm-linux-gcc编译arm裸机程序(可调用库)
  17. 地图的历史:从古代地图到 GIS
  18. 构建CMS:结构和样式
  19. 指令集董事长潘爱民出席2022 ECUG Con,为中国技术力量发声
  20. 网页设计用什么软件最好

热门文章

  1. PTA:单继承中的构造函数与析构函数(c++,继承)
  2. scrapyd 启动
  3. 三维向量的简单运算(点积、叉积及点到直线的距离)
  4. 【微信小程序】微信小程序使用表单的一些坑和注意事项
  5. 每天几个动作 帮新娘打造精致小脸
  6. afl-fuzz资源汇总
  7. 自定义底部弹出Dialog(老掉牙的需求还是记录一下吧)
  8. PostgreSQL with(with recursive )查询
  9. 军令上只写着:攻下城池!
  10. h5ai v0.29中文文件名、文件、url乱码解决方法