Android音乐播放器——甩动切歌

前言: 使用MediaPlayer实现Android的音乐播放器,能够播放、暂停、停止歌曲,控制播放上一首,下一首歌曲;同时可以使用感应器来感应甩动动作,然后完成切换歌曲的操作。

1. 第一步

布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"android:layout_margin="20dp"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayout
        android:gravity="center"android:layout_width="match_parent"android:layout_height="match_parent"><ImageButton
            android:id="@+id/previous_ib"android:src="@mipmap/previous_track"android:background="@null"android:layout_width="wrap_content"android:layout_height="wrap_content"/><ImageButton
            android:id="@+id/play_ib"android:src="@mipmap/bofang"android:background="@null"android:layout_marginLeft="10dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/><ImageButton
            android:id="@+id/pause_ib"android:src="@mipmap/pause"android:background="@null"android:layout_marginLeft="10dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/><ImageButton
            android:id="@+id/stop_ib"android:src="@mipmap/stop"android:background="@null"android:layout_marginLeft="10dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/><ImageButton
            android:id="@+id/next_ib"android:src="@mipmap/next_track"android:background="@null"android:layout_marginLeft="10dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout><LinearLayout
        android:gravity="bottom|right"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><ImageButton
            android:id="@+id/volume_plus_ib"android:src="@mipmap/volume_increase"android:background="@null"android:layout_width="wrap_content"android:layout_height="wrap_content"/><ImageButton
            android:id="@+id/volume_decrease_ib"android:src="@mipmap/volume_decrease"android:background="@null"android:layout_marginTop="20dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout></RelativeLayout>

布局文件里添加了一写控制音乐的组件,包括播放、暂停、停止、上一首、下一首、音量加、音量减的按钮。

2. 第二步

编写甩动手机时的监听器,ShakeListener.java

public class ShakeListener implements SensorEventListener {//速度阈值,当摇晃速度达到这值后产生作用private static final int SPEED_SHRESHOLD = 4000;//两次检测的时间间隔private static final int UPTATE_INTERVAL_TIME = 70;//传感器管理器private SensorManager sensorManager;//传感器private Sensor sensor;//重力感应监听器private OnShakeListener onShakeListener;//上下文private Context context;//手机上一个位置时重力感应坐标private float lastX;private float lastY;private float lastZ;//上次检测时间private long lastUpdateTime;//构造器public ShakeListener(Context c) {//获得监听对象context = c;start();}//开始public void start() {//获得传感器管理器sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);if(sensorManager != null) {//获得重力传感器sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);}//注册if(sensor != null) {sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);}}//停止检测public void stop() {sensorManager.unregisterListener(this);}//设置重力感应监听器public void setOnShakeListener(OnShakeListener listener) {onShakeListener = listener;}@Overridepublic void onSensorChanged(SensorEvent sensorEvent) {//现在检测时间long currentUpdateTime = System.currentTimeMillis();//两次检测的时间间隔long timeInterval = currentUpdateTime - lastUpdateTime;//判断是否达到了检测时间间隔if(timeInterval < UPTATE_INTERVAL_TIME)return;//现在的时间变成last时间lastUpdateTime = currentUpdateTime;//获得x,y,z坐标float x = sensorEvent.values[0];float y = sensorEvent.values[1];float z = sensorEvent.values[2];//获得x,y,z的变化值float deltaX = x - lastX;float deltaY = y - lastY;float deltaZ = z - lastZ;//将现在的坐标变成last坐标lastX = x;lastY = y;lastZ = z;double speed = Math.sqrt(deltaX*deltaX + deltaY*deltaY + deltaZ*deltaZ)/timeInterval * 10000;//达到速度阀值,发出提示if(speed >= SPEED_SHRESHOLD)onShakeListener.onShake();}@Overridepublic void onAccuracyChanged(Sensor sensor, int i) {}//摇晃监听接口public interface OnShakeListener {public void onShake();}

3. 编写Activity——Music2Activity.java

public class Music2Activity extends AppCompatActivity implements View.OnClickListener, MediaPlayer.OnCompletionListener {private ImageButton play,pause,stop,volume_plus,volume_decrease,next,previous;private MediaPlayer mediaPlayer = new MediaPlayer();private AudioManager audioManager;int maxVolume,currentVolume;String[] musicList = new String[]{"/sdcard/music1.mp3","/sdcard/music2.mp3","/sdcard/music3.mp3","/sdcard/music4.mp3"};int currentMusic = 0;private ShakeListener shakeListener;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_music2);audioManager = (AudioManager) getSystemService(Service.AUDIO_SERVICE);initView();play.setOnClickListener(Music2Activity.this);pause.setOnClickListener(Music2Activity.this);stop.setOnClickListener(Music2Activity.this);volume_plus.setOnClickListener(Music2Activity.this);volume_decrease.setOnClickListener(Music2Activity.this);next.setOnClickListener(Music2Activity.this);previous.setOnClickListener(Music2Activity.this);//监听器,自动播放下一首歌曲mediaPlayer.setOnCompletionListener(Music2Activity.this);if (ContextCompat.checkSelfPermission(Music2Activity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(Music2Activity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);}else {initMediaPlayer();//初始化mediaplayer}shakeListener = new ShakeListener(Music2Activity.this);shakeListener.setOnShakeListener(new ShakeListener.OnShakeListener() {@Overridepublic void onShake() {//对手机摇晃后的处理(如换歌曲,换图片……)currentMusic++;if (currentMusic == musicList.length){currentMusic = 0;}changeMusic();}});}private void initView() {play = (ImageButton) findViewById(R.id.play_ib);pause = (ImageButton) findViewById(R.id.pause_ib);stop = (ImageButton) findViewById(R.id.stop_ib);volume_plus = (ImageButton) findViewById(R.id.volume_plus_ib);volume_decrease = (ImageButton) findViewById(R.id.volume_decrease_ib);next = (ImageButton) findViewById(R.id.next_ib);previous = (ImageButton) findViewById(R.id.previous_ib);}private void initMediaPlayer() {try {mediaPlayer.setDataSource(musicList[0]);//指定音频文件的路径mediaPlayer.prepare();//让mediaplayer进入准备状态} catch (Exception e) {e.printStackTrace();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {switch (requestCode) {case 1:if (grantResults.length > 0 &&grantResults[0] == PackageManager.PERMISSION_GRANTED) {initMediaPlayer();} else {Toast.makeText(Music2Activity.this,"denied access",Toast.LENGTH_SHORT).show();finish();}break;default:}}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.play_ib:if (!mediaPlayer.isPlaying()) {mediaPlayer.start();//开始播放}break;case R.id.pause_ib:if (mediaPlayer.isPlaying()) {mediaPlayer.pause();//暂停播放}break;case R.id.stop_ib:Toast.makeText(Music2Activity.this,"停止播放",Toast.LENGTH_SHORT).show();if (mediaPlayer.isPlaying()) {mediaPlayer.reset();//停止播放initMediaPlayer();}break;//音量加case R.id.volume_plus_ib:maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_RAISE,AudioManager.FLAG_SHOW_UI);currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);Toast.makeText(Music2Activity.this,"音量增加,最大音量是:" + maxVolume + ",当前音量" + currentVolume,Toast.LENGTH_SHORT).show();break;//音量减case R.id.volume_decrease_ib:maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_LOWER,AudioManager.FLAG_SHOW_UI);currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);Toast.makeText(Music2Activity.this,"音量减小,最大音量是:" + maxVolume + ",当前音量" + currentVolume,Toast.LENGTH_SHORT).show();break;//下一首case R.id.next_ib:currentMusic++;if (currentMusic == musicList.length){currentMusic = 0;}changeMusic();Toast.makeText(Music2Activity.this,"下一首:"+musicList[currentMusic],Toast.LENGTH_SHORT).show();break;//上一首case R.id.previous_ib:currentMusic--;if (currentMusic == -1) {currentMusic = musicList.length-1;}changeMusic();Toast.makeText(Music2Activity.this,"上一首:"+musicList[currentMusic],Toast.LENGTH_SHORT).show();break;default:break;}}private void changeMusic() {//重置mediaPlayer.reset();try {//设置音乐文件来源mediaPlayer.setDataSource(musicList[currentMusic]);//准备(缓冲文件)mediaPlayer.prepare();//播放开始mediaPlayer.start();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void onCompletion(MediaPlayer mediaPlayer) {currentMusic++;if (currentMusic == musicList.length){currentMusic = 0;}changeMusic();}@Overrideprotected void onDestroy() {super.onDestroy();if (mediaPlayer != null) {mediaPlayer.stop();mediaPlayer.release();}}
}

前言: 这样我们就可以通过甩动手机来完成切换歌曲的任务了。

Android音乐播放器——甩动切歌相关推荐

  1. Android音乐播放器的设计与实现

    课程设计报告 实习名称 课程设计2 设计题目 Android音乐播放器的设计与实现 目录 摘要11 1 引言22 2 可行性分析22 2.1 技术可行性22 2.2 经济可行性33 2.3 管理可行性 ...

  2. 基于android音频感知系统,本科毕业论文—基于android音乐播放器的设计与实现专科.doc...

    本科毕业论文-基于android音乐播放器的设计与实现专科.doc 专科毕业设计(论文) 题 目 基于Android的音乐播放器设计与实现 毕业论文(设计)原创性声明 本人所呈交的毕业论文(设计)是我 ...

  3. android音乐播放器(改进版)

    这个是对以前做的那个音乐播放器的优化版本,因为以前把控制音乐播放放在了activity里,这个版本已经放在了service中,在服务中控制播放音乐,通过BroadcastReceiver传递一些数据, ...

  4. 基于android音乐播放器的设计

    本科毕业论文(设计)诚信声明 本人郑重声明:所呈交的毕业论文(设计),题目<---基于android音乐播放器的设计----------->是本人在指导教师的指导下,进行研究工作所取得的成 ...

  5. Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 ---- 小达

    Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 拿好素材之后,打开你们的开发工具,小达这里用的是android studio1.0, 新建一个项目,打开activity_main ...

  6. android七大主流Android音乐播放器横向评测

    随着智能手机和3G网络的普及,移动互联网日益成为人们生活娱乐的重心之一.在音乐领域,竞争也十分激烈,在PC之后,几大提供音乐服务的厂商正在加紧占据手机客户端. 本期我们在Android平台挑选了七家国 ...

  7. Android音乐播放器开发(6)—ListView组件创建歌曲播放列表(内含原理分析)

    1. 说明 源码已同步到Gitee仓库,GitHub仓库,觉得还不错的话帮忙点个"star"吧,非常感谢. 以往的文章 服务端:Android音乐播放器开发–服务端 登录:Andr ...

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

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

  9. Android音乐播放器开发(5)—播放界面(播放、暂停、上一首、下一首,顺序播放、随机播放、拖拽进度条…)

    1. 说明 源码已同步到Gitee仓库,Github仓库,觉得还不错的话帮忙点个"star"吧,非常感谢. Android播放器专栏其它文章: 服务端:Android音乐播放器开发 ...

最新文章

  1. 简单易上手编译FFmpeg
  2. sklearn API快速上手
  3. ERROR: Could not find a version that satisfies the requirement trusted-host (from versions: none) ER
  4. kvm虚拟化管理平台WebVirtMgr部署-完整记录(2)
  5. gradle 2.1构建android出现错误的解决方案
  6. 用promise封装ajax_vue实践---vue结合 promise 封装原生ajax
  7. 北京集训:20180310
  8. 【hortonworks/registry】registry源码主类该怎么运行
  9. Android的图片压缩并上传
  10. android自定义控件动态,GitHub - itrenjunhua/WaveView: Android自定义控件实现动态百分比水波纹效果...
  11. php单列模式_PHP单例模式详解及实例代码
  12. mysql5.7下载镜像_docker重新打包MySQL5.7镜像
  13. Android性能分析工具“TraceView”,“Systrace UI”
  14. 如何将多个TXT合并成一个TXT,文件名称提取
  15. IDEA 错误 找不到或无法加载主类(完美解决)
  16. 2022西藏最新消防设施操作员模拟考试试题题库及答案
  17. A. Neko Finds Grapes-奇偶的性质及运用-Codeforces Round #554 (Div. 2)
  18. 青柠开车Spring Cloud(五) —— spring cloud的窗口zuul(路由和过滤器)
  19. gallery3D(3)
  20. vivado batch mode

热门文章

  1. Photoshop三分钟制作艺术照
  2. 在Unity中使用Font Awesome图标字体
  3. 项目中用到的数字证书的创建,签名实现
  4. 线性代数之 向量空间与基,子空间,列空间,零空间,秩
  5. 如何破解联网收费软件,求高手指点
  6. 【元胞自动机】激进策略元胞自动机三车道(不开放辅路,软件园影响)交通流模型【含Matlab源码 1297期】
  7. UG NX 12 曲面
  8. linux命令pickup,Linux进程管理及相关命令
  9. evernote 云笔记_屏幕快照之旅:Windows版Evernote 4使记笔记变得很愉快
  10. 最优二叉查找树 次优二叉查找树 最优二叉树