Android音乐播放器——甩动切歌
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音乐播放器——甩动切歌相关推荐
- Android音乐播放器的设计与实现
课程设计报告 实习名称 课程设计2 设计题目 Android音乐播放器的设计与实现 目录 摘要11 1 引言22 2 可行性分析22 2.1 技术可行性22 2.2 经济可行性33 2.3 管理可行性 ...
- 基于android音频感知系统,本科毕业论文—基于android音乐播放器的设计与实现专科.doc...
本科毕业论文-基于android音乐播放器的设计与实现专科.doc 专科毕业设计(论文) 题 目 基于Android的音乐播放器设计与实现 毕业论文(设计)原创性声明 本人所呈交的毕业论文(设计)是我 ...
- android音乐播放器(改进版)
这个是对以前做的那个音乐播放器的优化版本,因为以前把控制音乐播放放在了activity里,这个版本已经放在了service中,在服务中控制播放音乐,通过BroadcastReceiver传递一些数据, ...
- 基于android音乐播放器的设计
本科毕业论文(设计)诚信声明 本人郑重声明:所呈交的毕业论文(设计),题目<---基于android音乐播放器的设计----------->是本人在指导教师的指导下,进行研究工作所取得的成 ...
- Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 ---- 小达
Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 拿好素材之后,打开你们的开发工具,小达这里用的是android studio1.0, 新建一个项目,打开activity_main ...
- android七大主流Android音乐播放器横向评测
随着智能手机和3G网络的普及,移动互联网日益成为人们生活娱乐的重心之一.在音乐领域,竞争也十分激烈,在PC之后,几大提供音乐服务的厂商正在加紧占据手机客户端. 本期我们在Android平台挑选了七家国 ...
- Android音乐播放器开发(6)—ListView组件创建歌曲播放列表(内含原理分析)
1. 说明 源码已同步到Gitee仓库,GitHub仓库,觉得还不错的话帮忙点个"star"吧,非常感谢. 以往的文章 服务端:Android音乐播放器开发–服务端 登录:Andr ...
- Android音乐播放器的开发实例(2021新版-Java版)
Android音乐播放器的开发实例 介绍 该项目旨在引导喜爱 Android 开发爱好者入门教程实例,可以一步一步的跟着来完成属于自己的项目开发过程. 此项目为基于 Java 语言开发,使用 Recy ...
- Android音乐播放器开发(5)—播放界面(播放、暂停、上一首、下一首,顺序播放、随机播放、拖拽进度条…)
1. 说明 源码已同步到Gitee仓库,Github仓库,觉得还不错的话帮忙点个"star"吧,非常感谢. Android播放器专栏其它文章: 服务端:Android音乐播放器开发 ...
最新文章
- 简单易上手编译FFmpeg
- sklearn API快速上手
- ERROR: Could not find a version that satisfies the requirement trusted-host (from versions: none) ER
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(2)
- gradle 2.1构建android出现错误的解决方案
- 用promise封装ajax_vue实践---vue结合 promise 封装原生ajax
- 北京集训:20180310
- 【hortonworks/registry】registry源码主类该怎么运行
- Android的图片压缩并上传
- android自定义控件动态,GitHub - itrenjunhua/WaveView: Android自定义控件实现动态百分比水波纹效果...
- php单列模式_PHP单例模式详解及实例代码
- mysql5.7下载镜像_docker重新打包MySQL5.7镜像
- Android性能分析工具“TraceView”,“Systrace UI”
- 如何将多个TXT合并成一个TXT,文件名称提取
- IDEA 错误 找不到或无法加载主类(完美解决)
- 2022西藏最新消防设施操作员模拟考试试题题库及答案
- A. Neko Finds Grapes-奇偶的性质及运用-Codeforces Round #554 (Div. 2)
- 青柠开车Spring Cloud(五) —— spring cloud的窗口zuul(路由和过滤器)
- gallery3D(3)
- vivado batch mode