简单Android音乐播放器

    通过一段时间的学习,我制作了一个简单的音乐播放器,可以实现一些音乐功能,界面如下图所示:


1、界面的制作

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/Image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:paddingTop="40dp"
        android:src="@drawable/ic_launcher" />

    <!-- 显示歌曲状态 -->

    <TextView
        android:id="@+id/MusicStatus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:gravity="center_horizontal"
        android:paddingTop="120dp" >

        <TextView
            android:id="@+id/MusicTime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="00:00" />

        <SeekBar
            android:id="@+id/MusicSeekBar"
            android:layout_width="200sp"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/MusicTime"
            android:layout_weight="1"
            android:max="100" />

        <TextView
            android:id="@+id/MusicTotal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/MusicSeekBar"
            android:text="00:00" />
    </RelativeLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:gravity="center_horizontal"
        android:orientation="horizontal"
        android:paddingTop="20dp" >

        <Button
            android:id="@+id/BtnPlayorPause"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="15dp"
            android:background="@drawable/shape"
            android:text="PLAY"
            android:textAllCaps="false"
            android:textColor="@color/colorWhite" />

        <Button
            android:id="@+id/BtnStop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="15dp"
            android:background="@drawable/shape"
            android:text="STOP"
            android:textAllCaps="false"
            android:textColor="@color/colorWhite" />

        <Button
            android:id="@+id/BtnQuit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/shape"
            android:text="QUIT"
            android:textAllCaps="false"
            android:textColor="@color/colorWhite" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="horizontal"
        android:paddingTop="5dp" >

        <Button
            android:id="@+id/BtnPre"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/shape"
            android:text="LAST"
            android:textAllCaps="false"
            android:textColor="@color/colorWhite" />

        <Button
            android:id="@+id/BtnNext"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:background="@drawable/shape"
            android:text="NEXT"
            android:textAllCaps="false"
            android:textColor="@color/colorWhite" />
    </LinearLayout>

</LinearLayout>
2、页面制作完成后,则在MainActivity中将控件声明和初始化

private TextView musicStatus, musicTime, musicTotal;
    private SeekBar seekBar;
    private Button btnPlayOrPause, btnStop, btnQuit, btnNext, btnLast;


musicTime = (TextView) findViewById(R.id.MusicTime);
        musicTotal = (TextView) findViewById(R.id.MusicTotal);
        seekBar = (SeekBar) findViewById(R.id.MusicSeekBar);
        btnPlayOrPause = (Button) findViewById(R.id.BtnPlayorPause);
        btnStop = (Button) findViewById(R.id.BtnStop);
        btnQuit = (Button) findViewById(R.id.BtnQuit);
        btnLast = (Button) findViewById(R.id.BtnPre);
        btnNext = (Button) findViewById(R.id.BtnNext);
        musicStatus = (TextView) findViewById(R.id.MusicStatus);
3、本音乐播放器运用server来进行控制,以实现后台播放。所以,之后新建MusicService类,用来继承server。并在MusicService中定义MediaPlayer用来控制音乐的播放。
定义和使用MediaPlayer:

public MusicService() {
        mediaPlayer = new MediaPlayer();
        try {
        	musicIndex = 0;
            mediaPlayer.setDataSource(musicDir[musicIndex]);
            mediaPlayer.prepare();
            mediaPlayer.setLooping(false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
音乐播放的停止和开始等功能(上一首和下一首代码类似):

 public void playOrPause() {
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.pause();
        } else {
            mediaPlayer.start();
        }
    }

    public void stop() {
        if (mediaPlayer != null) {
            mediaPlayer.stop();
            try {
                mediaPlayer.reset();
                mediaPlayer.setDataSource(musicDir[musicIndex]);
                mediaPlayer.prepare();
                mediaPlayer.seekTo(0);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    //下一首  
    public void nextMusic() {  
        if(mediaPlayer != null && musicIndex < 2) {  
        	mediaPlayer.stop();  
            try {  
            	mediaPlayer.reset();  
            	mediaPlayer.setDataSource(musicDir[musicIndex+1]);  
                musicIndex++;  
                mediaPlayer.prepare();  
                mediaPlayer.seekTo(0);  
                mediaPlayer.start();  
            } catch (Exception e) {  
               
                e.printStackTrace();  
            }  
        }else {  
            Toast.makeText(this, "没有更多歌曲啦", Toast.LENGTH_SHORT).show();  
        }  
    }  
4、Activity 和 Service 的通信

 public MyBinder binder = new MyBinder();
    public class MyBinder extends Binder {
        MusicService getService() {
            return MusicService.this;
        }
    }

//  在Activity中调用 bindService 保持与 Service 的通信
    private void bindServiceConnection() {
        Intent intent = new Intent(MainActivity.this, MusicService.class);
        startService(intent);
        bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
    }

    //  回调onServiceConnected 函数,通过IBinder 获取 Service对象,实现Activity与 Service的绑定
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            musicService = ((MusicService.MyBinder) (service)).getService();
            Log.i("musicService", musicService + "");
            musicTotal.setText(time.format(musicService.mediaPlayer.getDuration()));
           //musicService = ((MusicService.MyBinder)service).getService();
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {
            musicService = null;
        }
    };
5、handler的使用。
因为Android的UI更新只能在主线程中,所以我们用handler来更新UI

public Handler handler = new Handler();
    public Runnable runnable = new Runnable() {
        @Override
        public void run() {
            musicTime.setText(time.format(musicService.mediaPlayer.getCurrentPosition()));
            seekBar.setProgress(musicService.mediaPlayer.getCurrentPosition());
            seekBar.setMax(musicService.mediaPlayer.getDuration());
            musicTotal.setText(time.format(musicService.mediaPlayer.getDuration()));
            handler.postDelayed(runnable, 200);

        }
    };
6、各个控件的监听事件

 seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser == true) {
                    musicService.mediaPlayer.seekTo(progress);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

    }
btnPlayOrPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (musicService.mediaPlayer != null) {
                    seekBar.setProgress(musicService.mediaPlayer.getCurrentPosition());
                    seekBar.setMax(musicService.mediaPlayer.getDuration());
                }
                //  由tag的变换来控制事件的调用
                if (musicService.tag != true) {
                    btnPlayOrPause.setText("PAUSE");
                    musicStatus.setText("Playing");
                    musicService.playOrPause();
                    musicService.tag = true;

                    if (tag1 == false) {
                        animator.start();
                        tag1 = true;
                    } else {
                       imageView.clearAnimation(); //animator.resume();
                    }
                } else {
                    btnPlayOrPause.setText("PLAY");
                    musicStatus.setText("Paused");
                    musicService.playOrPause();
                    imageView.clearAnimation(); //animator.pause();
                    musicService.tag = false;
                }
                if (tag2 == false) {
                    handler.post(runnable);
                    tag2 = true;
                }
            }
        });
各个控件的监听大同小异,我就一一列举,最主要的是下面这个监听

//  停止服务时,必须解除绑定,写入btnQuit按钮中
        btnQuit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handler.removeCallbacks(runnable);
                unbindService(serviceConnection);
                Intent intent = new Intent(MainActivity.this, MusicService.class);
                stopService(intent);
                try {
                    MainActivity.this.finish();
                } catch (Exception e) {

                }
            }
        });
7、从sdcard中读取音乐文件, 有两种不同的方式

private String[] musicDir = new String[]{"/mnt/sdcard/LOST.DIR/a1.mp3","/mnt/sdcard/LOST.DIR/b2.mp3"}; //虚拟机上的目录
   
   // private String[] musicDir = new String[]{Environment.getExternalStorageDirectory().getAbsolutePath()+"/music/Honor.mp3",
    //	Environment.getExternalStorageDirectory().getAbsolutePath()+"/music/Jive_Cool.mp3"};读取外部储存卡(手机的目录)

8、大概代码和流程就是这些了,制作比较简单。下面是下载的地址:

下载地址:点击打开链接

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 第一章 引 言 - 1 - 1.1 项目背景 - 1 - 1.2 编写目的 - 2 - 第二章 系统需求分析 - 3 - 2.1 功能需求(用例图分析) - 3 - 2.1.1 播放器的基本控制需求 - 3 - 2.1.2 播放清单列表管理需求 - 5 - 2.1.3 播放友好性需求 - 7 - 2.1.4 播放器扩展卡需求 - 8 - 2.1.5 功能需求(时序图)分析 - 9 - 2.2 系统结构图和流程图 - 10 - 2.3 系统界面需求 - 11 - 2.4 系统性能需求 - 12 - 2.5 运行环境需求 - 12 - 第三章 Android数据库设计 - 13 - 3.1 数据库及字段属性设计 - 13 - 3.1.1 字段设计(表、图) - 13 - 3.1.2 音乐播放器E-R图 - 15 - 3.2 数据库连接 - 15 - 3.2.1 创建数据库 - 15 - 3.2.2 操作数据库 - 16 - 3.2.3 数据显示 - 17 - 第四章 Android项目介绍 - 18 - 4.1 什么是Android? - 18 - 4.1.1 Android简介 - 18 - 4.1.2 Android Features特性 - 18 - 4.1.3 Android基本框架(Android Architecture) - 19 - 4.1.4 Android系统的四大组件 - 22 - 4.2 搭建Android开发环境 - 23 - 4.3 Android常用工具的使用 - 25 - 4.3.1 命令行的使用 - 25 - 4.3.2 Dalvik Debug Monitor Service (DDMS)的使用 - 26 - 4.4 Android 音乐播放器的工程 - 26 - 4.4.1 Android项目 - 26 - 4.4.2 Android工程程序结构 - 27 - 4.4.3 AndroidManifest.xml文件 - 29 - 第五章 播放器系统功能详细设计 - 31 - 5.1音乐播放器主界面功能实现 - 31 - 5.1.1 播放器主界面 - 31 - 5.1.2 播放界面音轨的实现 - 32 - 5.1.3 播放器播放、暂停、停止等功能 - 35 - 5.2 播放列表功能 - 36 - 5.3 菜单功能 - 38 - 5.3.1 菜单界面 - 38 - 5.3.2 菜单功能实现 - 39 - 5.4 播放设置界面 - 41 - 5.4.1 界面实现 - 41 - 5.4.2 歌词显示实现 - 42 - 5.5 手机扩展卡的访问 - 44 - 5.5.1 文件浏览器界面 - 45 - 5.5.2 文件浏览器功能实现 - 46 - 5.6 数据存储方式 - 47 - 5.6.1 SharedPreferences - 47 - 5.6.2 File存储方式 - 48 - 5.6.3 SQLiteDatabase数据库 - 48 - 第六章 结 论 - 49 -

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值