Music播放器

1.开启服务实现销毁Activity后能实现继续播放

  1 package text.baidumusic;
  2
  3 import android.app.Service;
  4 import android.content.Intent;
  5 import android.media.MediaPlayer;
  6 import android.os.Binder;
  7 import android.os.Bundle;
  8 import android.os.IBinder;
  9 import android.os.Message;
 10 import android.support.annotation.Nullable;
 11
 12 import java.util.Timer;
 13 import java.util.TimerTask;
 14
 15 /**
 16  * Created by liuwei on 7/8/17.
 17  */
 18
 19 public class MusicService extends Service {
 20     private MediaPlayer mediaPlayer;
 21     private class myBinder extends Binder implements myMusicService{
 22         @Override
 23         public void startPlay() {
 24             playMusic();
 25         }
 26
 27         @Override
 28         public void pausePlay() {
 29             pauseMusic();
 30         }
 31
 32         @Override
 33         public void stopPlay() {
 34             stopMusic();
 35         }
 36         @Override
 37         public void repaly() {
 38             replayMusic();
 39         }
 40
 41         @Override
 42         public void seekTo(int position) {
 43             seekTo(position);
 44         }
 45     }
 46     @Nullable
 47     @Override
 48     public IBinder onBind(Intent intent) {
 49         return new myBinder() ;
 50     }
 51     public void playMusic(){
 52         System.out.println("音乐播放");
 53         try {
 54             mediaPlayer.setDataSource("/mnt/sdcard/1.mp3");
 55             mediaPlayer.prepare();
 56             mediaPlayer.start();
 57             updateSeekBar();
 58         } catch (Exception e) {
 59             e.printStackTrace();
 60         }
 61     }
 62
 63     private void updateSeekBar() {
 64         //获取当前播放总进度
 65         final int duration=mediaPlayer.getDuration();
 66         //使用timer
 67         Timer timer=new Timer();
 68         TimerTask task=new TimerTask() {
 69             @Override
 70             public void run() {
 71                 int currentPosition=mediaPlayer.getCurrentPosition();
 72                 Message msg=Message.obtain();
 73                 Bundle bundle=new Bundle();
 74                 bundle.putInt("duration",duration);
 75                 bundle.putInt("currentPosition",currentPosition);
 76                 msg.setData(bundle);
 77                 MainActivity.handler.sendMessage(msg);
 78             }
 79         };
 80         timer.schedule(task,100,1000);
 81     }
 82
 83     public void replayMusic(){
 84         mediaPlayer.start();
 85     }
 86     public void pauseMusic(){
 87         System.out.println("音乐暂停");
 88         mediaPlayer.pause();
 89     }
 90     public void stopMusic(){
 91         System.out.println("音乐停止");
 92         mediaPlayer.stop();
 93         onDestroy();
 94         onCreate();
 95     }
 96     public void seekTo(int position){
 97         mediaPlayer.seekTo(position);
 98     }
 99     @Override
100     public void onCreate() {
101         System.out.println("音乐服务创建");
102         mediaPlayer = new MediaPlayer();
103         super.onCreate();
104     }
105
106     @Override
107     public void onDestroy() {
108         System.out.println("音乐服务销毁");
109         super.onDestroy();
110     }
111 }

Service

2.通过暴露接口的方法实现在活动中操作服务

1 public interface myMusicService {
2     public void startPlay();
3     public void pausePlay();
4     public void stopPlay();
5     public void repaly();
6     public void seekTo(int position);
7 }

3.对music音乐通过开启绑定服务的方式进行播放,暂停,继续,停止操作

 1 package text.baidumusic;
 2
 3 import android.Manifest;
 4 import android.content.ComponentName;
 5 import android.content.Intent;
 6 import android.content.ServiceConnection;
 7 import android.content.pm.PackageManager;
 8 import android.media.MediaPlayer;
 9 import android.os.Handler;
10 import android.os.IBinder;
11 import android.os.Message;
12 import android.support.annotation.NonNull;
13 import android.support.v4.app.ActivityCompat;
14 import android.support.v4.content.ContextCompat;
15 import android.support.v7.app.AppCompatActivity;
16 import android.os.Bundle;
17 import android.view.View;
18 import android.widget.SeekBar;
19 import android.widget.Toast;
20
21 import java.io.File;
22 import java.io.IOException;
23
24 public class MainActivity extends AppCompatActivity {
25     private myMusicService iMusicService;
26     private MyConn conn;
27     private static SeekBar seekBar;
28     public static Handler handler=new Handler(){
29         public void handleMessage(Message msg) {
30             //获取数据
31             Bundle bundle=msg.getData();
32             int duration=bundle.getInt("duration");
33             int currentPosition = bundle.getInt("currentPosition");
34             seekBar.setMax(duration);
35             seekBar.setProgress(currentPosition);
36         }
37     };
38     @Override
39     protected void onCreate(Bundle savedInstanceState) {
40         super.onCreate(savedInstanceState);
41         setContentView(R.layout.activity_main);
42         if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
43                 PackageManager.PERMISSION_GRANTED){
44             ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
45         }
46         Intent intent=new Intent(this,MusicService.class);
47         startService(intent);
48         conn=new MyConn();
49         bindService(intent,conn,BIND_AUTO_CREATE);
50         //找到seekBar
51         seekBar=(SeekBar)findViewById(R.id.sb);
52     }
53     public void play(View v){
54         iMusicService.startPlay();
55     }
56     public void replay(View v){
57         iMusicService.repaly();
58     }
59     public void pause(View v){
60         iMusicService.pausePlay();
61     }
62     public void stop(View v){
63         iMusicService.stopPlay();
64     }
65     private class MyConn implements ServiceConnection {
66         @Override
67         public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
68             iMusicService=(myMusicService)iBinder;
69         }
70
71         @Override
72         public void onServiceDisconnected(ComponentName componentName) {
73
74         }
75     }
76     @Override
77     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
78         switch (requestCode){
79             case 1:
80                 if (grantResults.length<0&&grantResults[0]!=PackageManager.PERMISSION_GRANTED){
81                     Toast.makeText(this,"不授权将无法使用",Toast.LENGTH_LONG).show();
82                 }
83         }
84     }
85 }

MainActivity

4.添加通过拖动进度条调整播放进度

4.1在服务当中监视当前歌曲播放进度,并通过handler.sendMessage方法进行把数据传递当MainActivity中

 1 private void updateSeekBar() {
 2         //获取当前播放总进度
 3         final int duration=mediaPlayer.getDuration();
 4         //使用timer
 5         final Timer timer=new Timer();
 6         final TimerTask task=new TimerTask() {
 7             @Override
 8             public void run() {
 9                 int currentPosition=mediaPlayer.getCurrentPosition();
10                 Message msg=Message.obtain();
11                 Bundle bundle=new Bundle();
12                 bundle.putInt("duration",duration);
13                 bundle.putInt("currentPosition",currentPosition);
14                 msg.setData(bundle);
15                 MainActivity.handler.sendMessage(msg);
16             }
17         };
18         timer.schedule(task,100,1000);
19         //当歌曲执行完毕后取消
20         mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
21             @Override
22             public void onCompletion(MediaPlayer mediaPlayer) {
23                 timer.cancel();
24                 task.cancel();
25             }
26         });
27     }

4.2在handler类中调用handlermessage方法,对于服务所传递过来的数据进行操作

public static Handler handler=new Handler(){
        public void handleMessage(Message msg) {
            //获取数据
            Bundle bundle=msg.getData();
            int duration=bundle.getInt("duration");
            int currentPosition = bundle.getInt("currentPosition");
            seekBar.setMax(duration);
            seekBar.setProgress(currentPosition);
        }
    };

4.3通过设置对进度条的监听事件调用MediaPlayer类中的seekTo方法

   seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                //当进度改变调用
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                //拖动停止调用
                iMusicService.seekToPlay(seekBar.getProgress());
            }
        });
时间: 2024-11-02 21:06:39

Music播放器的相关文章

Android实现音乐播放器(一)

Graphical User Interface 本篇文章记录了我实现Android简单音乐播放器的过程,(一)中介绍了怎么构建音乐播放器的前端页面.首先大家看一下,界面最后是这样的(界面有点粗陋) 音乐文件列表是从SD卡中读取出来的. 首先我们先在Layout里面创建Music Player的GUI,diagram如下图所示: 根据diagram我们在activity_main.xml写出如下代码: <LinearLayout xmlns:android="http://schemas.

仿网易云音乐播放器(磁盘转圈、背景虚化等等)

先看效果,CSDN的git传上去总是不动.不知道为什么. 主要思路: 1 . 除了 開始/暂停 .上一首.下一首 这三个icon.你看到的是一个ViewGroup ,这个ViewGroup里面有圆形封面.黑色圈圈磁盘.唱针,高斯模糊背景图 2. 凝视掉了磁盘一起转动的效果,如今的方案不是最好的,建议若是想实现,能够把圆形封面和磁盘合并成一张图(最好在CicicleImageView这里面做).给一个旋转动画.两个动画.两个View,帧的频率不会那么高 3.凝视掉了上一首.下一首切换的时候渐变的动

微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器

我的微信开发者工具 开篇语 好不容易,终于把所有的基础课程全部看完了!昨天,我很高兴地开始了看别人做的项目进行深度的学习.其实也说不上是项目吧,更多的像是一种给新手看的示例代码.然后我在这些代码上面进行我自己的改进.最后也就有了接下来我会给大家带来的这篇文章中的项目.这个项目是完整的,它包括了一个原本的示例代码中带着的莫名其妙的动画组件(可能是为了更多额展示微信小程序的控件体系)以及跑步的组件,还有我后来自己加上去的一个音乐播放组件.总共也就有了三个的功能:动画效果展示:跑步的定时以及定位功能:

手把手教你做音乐播放器(八)桌面小工具(上)

第8节 桌面小工具 桌面小工具是可以放置在主界面的.快速控制应用的小助手.例如我们的音乐小工具,它可以帮助用户在桌面上就完成音乐的暂停.播放.切换等操作,而不需要启动应用本身. 在安卓系统中,我们也常常叫它App widget. 实现一个App widget要经过以下几个步骤, 创建一个App widget类,让它继承自AppWidgetProvider,例如AnddleMusicAppWidget类: 放在res\layout目录下,为App widget的界面定义一个布局,例如anddle_

Android12_播放器_surfaceVIew_照相机_传感器

编程的时间与空间的概念,两者不可兼得(技术固定),时间换空间,空间换时间 sufaceView占用比较大的空间但是效率高 1,音乐播放器 MediaPlayer ①同步的 大致流程按下图走即可,播放最好写在服务里,因为要在后台播放 1.1 new出来的mediaplayer 默认处于Idie(空闲),reset()也可以让其处于初始状态 1.2 setDataSource()设置好文件之后就处于Initialized()初始化状态 1.3 可以通过setOnErrorListener方法查看播放

c#开发的媒体播放器

在Microsoft Visual C# .NET 中使用 DirectShow 控件,来开发一个媒体播放器.按照本文介绍的操作步骤,您可以创建一个简单 Visual C# 应用程序,用来播放数字音频和视频. 介绍 Microsoft Visual C# 是世界上最流行的编程语言,利用 Visual C# 的最新版本 Visual C# .NET,您能够快速.有效地开发基于 Windows 窗体的应用程序,还可以为嵌入了 Microsoft Windows Media? Player 9 Ser

毕业设计——基于STM32的音乐播放器设计(一)

基于STM32的音乐播放器设计, 源代码下载地址:http://download.csdn.net/detail/cxp2205455256/8334021      SD卡文件下载地址:http://download.csdn.net/detail/cxp2205455256/8334089 电路图下载地址:文件太大了,上传不了....... 以下是截图: 1.硬件电路 2.软件主界面 3.音乐播放器界面 4.音乐定时播放界面 5.音乐列表界面 6.日历功能界面 9.温度功能界面 10.计算器

Xamarin.Android开发音乐播放器

最近.Net开源着实让C#火了一把,好久就听说Mono for Android一直没静下心来看,上周末找来看看,确实不错,前台界面axml编写跟Java安卓开发毫无区别,后台用C#其实很多windows下的方法都可以用,做一个安卓音乐播放器,主要实现音乐播放,上一曲下一曲,音乐播放列表,随机播放,扫描SD卡内所有音乐. 先show一组界面啊,话说有图有真相啊: 项目结构如图: Lrc是歌词处理方法 MusicService是安卓服务播放音乐,服务Broadcast,以及界面接收Receiver

Android通过意图使用内置的音频播放器

如果实现一个音频文件的播放,那么在应用程序中提供播放音频文件功能的最简单的方式是利用内置的"Music(音乐)"应用程序的功能--即使用系统自带的或已安装好的音乐播放器来播放指定的音频文件. 本例比较简单,下面直接给出源代码: 布局文件activity_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http:/

html网页音乐播放器自带播放列表

基于网页的音乐播放器demo  http://pan.baidu.com/s/1dDgm7HR 自己diy了一个手机端在线音乐播放器演示地址http://shanxi2014.com/zhuandizhi/dom.php 全面支持手机端浏览器. 主要修改引用路径(不要修改文件相对存放地址) 第二就是正则拼接参数了 <script src="/city/js/libs/jquery-1.10.2.min.js"></script> <script src=&