`
thunder_yan
  • 浏览: 112852 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

android开发之MediaPlayer+Service MP3播放器

阅读更多

 

import java.io.File;  
import java.io.FilenameFilter;  
import java.util.ArrayList;  
import java.util.List;  
  
import android.app.ListActivity;  
import android.apps.service.PlayerService;  
import android.content.Intent;  
import android.media.AudioManager;  
import android.os.Bundle;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.ArrayAdapter;  
import android.widget.Button;  
import android.widget.SeekBar;  
import android.widget.Toast;  
  
public class TestMediaPlayer extends ListActivity {  
    /* 前段时间刚学习Android时就觉得MediaPlayer是个很神奇的东西,就试着做了个简单的音乐播放器。 
     * 支持后台播放、进度条拖放、音量控制、读取sdCard音乐文件进行播放等。 
     * */  
    private Button playButton = null;  
    private Button mFrontButton = null;  
    private Button mLastButton = null;  
    private Button exit = null;  
    /* 声明音量管理器 */  
    private AudioManager mAudioManager = null;  
  
    /* 定义进度条 */  
    public static SeekBar audioSeekBar = null;  
  
    /* 定义音量大小 */  
    private SeekBar audioVolume = null;  
  
    /* 定于一个数据播放列表,用来存放从指定文件中搜索到的文件 */  
    public static List<String> mMusicList = new ArrayList<String>();  
  
    /* 定义音乐存放路径 */  
//  private static final String MUSIC_PATH = new String("/mnt/sdcard/"); //android 2.2  
    private static final String MUSIC_PATH = new String("/sdcard/");//android 2.1  
    /* 定义在播放列表中的当前选择项 */  
    public static int currentListItme = 0;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        /* 更新列表 */  
        musicList();  
        /* 得到控件 */  
        playButton = (Button) findViewById(R.id.StartMusic);  
        mFrontButton = (Button) findViewById(R.id.FrontButton);  
        mLastButton = (Button) findViewById(R.id.LastMusic);  
        audioVolume = (SeekBar) findViewById(R.id.audioVolume);  
        exit = (Button)findViewById(R.id.exit);  
        audioSeekBar = (SeekBar) findViewById(R.id.seekbar01);  
        /* 播放、暂停监听 */  
        playButton.setOnClickListener(new OnClickListener() {  
  
            @Override  
            public void onClick(View v) {  
  
                playMusic(AppConstant.PlayerMag.PAUSE);  
            }  
        });  
        /* 监听下一首 */  
        mFrontButton.setOnClickListener(new OnClickListener() {  
  
            @Override  
            public void onClick(View v) {  
                nextMusic();  
            }  
        });  
        /* 监听上一首 */  
        mLastButton.setOnClickListener(new View.OnClickListener() {  
  
            @Override  
            public void onClick(View v) {  
                FrontMusic();  
            }  
        });  
        /*退出监听*/  
        exit.setOnClickListener(new OnClickListener() {  
              
            @Override  
            public void onClick(View v) {  
                Intent intent = new Intent();  
                intent.setClass(TestMediaPlayer.this, PlayerService.class);  
                stopService(intent);//停止Service  
                try {  
                    TestMediaPlayer.this.finish();//关闭当前Activity  
                } catch (Throwable e) {  
                    e.printStackTrace();  
                }  
              
                  
            }  
        });  
        /* 播放进度监听 */  
        audioSeekBar.setOnSeekBarChangeListener(new SeekBarChangeEvent());  
        /*退出后再次进去程序时,进度条保持持续更新*/  
        if(PlayerService.mMediaPlayer!=null){  
            //设置进度条最大值  
            TestMediaPlayer.audioSeekBar.setMax(PlayerService.mMediaPlayer.getDuration());  
            audioSeekBar.setProgress(PlayerService.mMediaPlayer.getCurrentPosition());  
        }  
          
          
        /* 得到当前音量对象 */  
        mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);  
        /* 把当前音量值赋给进度条 */  
        audioVolume.setProgress(mAudioManager  
                .getStreamVolume(AudioManager.STREAM_MUSIC));  
        /* 监听音量 */  
        audioVolume.setOnSeekBarChangeListener(new AudioVolumeChangeEvent());  
    }  
  
    public void playMusic(int action) {  
        Intent intent = new Intent();  
        intent.putExtra("MSG", action);  
        intent.setClass(TestMediaPlayer.this, PlayerService.class);  
          
        /* 启动service service要在AndroidManifest.xml注册如:<service></service>*/  
          
        startService(intent);  
    }  
  
    /* 检测sdcard MP3文件并加入到List列表 */  
    public void musicList() {  
        // 先清除list中的缓存  
        mMusicList.clear();  
        /* 从指定的路径中读取文件,并与播放列表关联 */  
        File home = new File(MUSIC_PATH);  
          
        System.out.println(home.canRead());  
        /* 读取指定类型的文件,在本程序,指定播放类型为mp3 */  
        if (home.listFiles(new MusicFilter()).length > 0) {  
            /* 读取文件 */  
            for (File file : home.listFiles(new MusicFilter())) {  
                mMusicList.add(file.getName());  
            }  
            /* 播放文件与播放列表关联 */  
            ArrayAdapter<String> musicList = new ArrayAdapter<String>(  
                    TestMediaPlayer.this, R.layout.musictime, mMusicList);  
            setListAdapter(musicList);  
        }  
    }  
  
    /* 音量监听 */  
    class AudioVolumeChangeEvent implements SeekBar.OnSeekBarChangeListener {  
  
        @Override  
        public void onProgressChanged(SeekBar seekBar, int progress,  
                boolean fromUser) {  
  
            // mAudioManager.adjustVolume(AudioManager.ADJUST_LOWER, 0);  
            mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress,  
                    0);  
  
        }  
  
        @Override  
        public void onStartTrackingTouch(SeekBar seekBar) {  
        }  
  
        @Override  
        public void onStopTrackingTouch(SeekBar seekBar) {  
        }  
  
    }  
  
    /* 音乐选择监听 */  
    @Override  
    protected void onListItemClick(android.widget.ListView l, View v,  
            int position, long id) {  
        super.onListItemClick(l, v, position, id);  
        currentListItme = position;  
        playMusic(AppConstant.PlayerMag.PLAY_MAG);  
    }  
  
    /* 播放下一首 */  
    private void nextMusic() {  
        if (++currentListItme >= mMusicList.size()) {  
            Toast.makeText(TestMediaPlayer.this, "已到最后一首歌曲", Toast.LENGTH_SHORT)  
                    .show();  
            currentListItme = mMusicList.size() - 1;  
        } else {  
            playMusic(AppConstant.PlayerMag.PLAY_MAG);  
        }  
    }  
  
    /* 播放上一首歌曲 */  
    private void FrontMusic() {  
        if (--currentListItme >= 0) {  
            playMusic(AppConstant.PlayerMag.PLAY_MAG);  
  
        } else {  
            Toast.makeText(TestMediaPlayer.this, "已到第一首歌曲", Toast.LENGTH_SHORT)  
                    .show();  
            currentListItme = 0;  
        }  
    }  
}  
  
/* 播放文件选择类 */  
class MusicFilter implements FilenameFilter {  
    public boolean accept(File dir, String name) {  
        /* 指定扩展名类型 ,可以加其他的音乐格式*/  
        return (name.endsWith(".mp3"));  
    }  
}  
  
/* 拖放进度监听 ,别忘了Service里面还有个进度条刷新*/  
class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener {  
  
    @Override  
    public void onProgressChanged(SeekBar seekBar, int progress,  
            boolean fromUser) {  
        /*假设改变源于用户拖动*/  
        if (fromUser) {  
            PlayerService.mMediaPlayer.seekTo(progress);// 当进度条的值改变时,音乐播放器从新的位置开始播放  
        }  
    }  
  
    @Override  
    public void onStartTrackingTouch(SeekBar seekBar) {  
        PlayerService.mMediaPlayer.pause(); // 开始拖动进度条时,音乐暂停播放  
    }  
  
    @Override  
    public void onStopTrackingTouch(SeekBar seekBar) {  
        PlayerService.mMediaPlayer.start(); // 停止拖动进度条时,音乐开始播放  
    }  
}  

 

 

service类

首先建议不要把播放音乐放在Activity中,因为关闭Activity后就不能实现后台播放。所以播放音乐要放在Service中,我们只需要管理ActivityService间的通信就好了。下面就是个Service类。直接看注释和代码:

 

package android.apps.service;  
  
import java.io.IOException;  
  
import android.app.Service;  
import android.content.Intent;  
import android.media.MediaPlayer;  
import android.net.Uri;  
import android.os.IBinder;  
import android.widget.Toast;  
  
import android.apps.*;  
  
public class PlayerService extends Service implements Runnable,  
        MediaPlayer.OnCompletionListener {  
    /* 定于一个多媒体对象 */  
    public static MediaPlayer mMediaPlayer = null;  
    // 是否单曲循环  
    private static boolean isLoop = false;  
    // 用户操作  
    private int MSG;  
  
    /* 定义要播放的文件夹路径 */  
    private static final String MUSIC_PATH = new String("/sdcard/");  
  
    @Override  
    public IBinder onBind(Intent intent) {  
        return null;// 这里的绑定没的用,上篇我贴出了如何将activity与service绑定的代码  
    }  
  
    @Override  
    public void onCreate() {  
        super.onCreate();  
        if (mMediaPlayer != null) {  
            mMediaPlayer.reset();  
            mMediaPlayer.release();  
            mMediaPlayer = null;  
        }  
        mMediaPlayer = new MediaPlayer();  
        /* 监听播放是否完成 */  
        mMediaPlayer.setOnCompletionListener(this);  
    }  
  
    @Override  
    public void onDestroy() {  
        super.onDestroy();  
  
        if (mMediaPlayer != null) {  
            mMediaPlayer.stop();  
            mMediaPlayer.release();  
            mMediaPlayer = null;  
        }  
  
        System.out.println("service onDestroy");  
    }  
    /*启动service时执行的方法*/  
    @Override  
    public int onStartCommand(Intent intent, int flags, int startId) {  
        /*得到从startService传来的动作,后是默认参数,这里是我自定义的常量*/  
        MSG = intent.getIntExtra("MSG", AppConstant.PlayerMag.PLAY_MAG);  
        if (MSG == AppConstant.PlayerMag.PLAY_MAG) {  
            playMusic();  
        }  
        if (MSG == AppConstant.PlayerMag.PAUSE) {  
            if (mMediaPlayer.isPlaying()) {// 正在播放  
                mMediaPlayer.pause();// 暂停  
            } else {// 没有播放  
                mMediaPlayer.start();  
            }  
        }  
  
        return super.onStartCommand(intent, flags, startId);  
    }  
  
    @SuppressWarnings("static-access")  
    public void playMusic() {  
        try {  
            /* 重置多媒体 */  
            mMediaPlayer.reset();  
            /* 读取mp3文件 */  
            mMediaPlayer.setDataSource(MUSIC_PATH+TestMediaPlayer.mMusicList.get(TestMediaPlayer.currentListItme));  
//          Uri uri = Uri.parse(MUSIC_PATH+TestMediaPlayer.mMusicList.get(TestMediaPlayer.currentListItme));  
//            
//          mMediaPlayer.create(PlayerService.this,uri);  
            /* 准备播放 */  
            mMediaPlayer.prepare();  
            /* 开始播放 */  
            mMediaPlayer.start();  
            /* 是否单曲循环 */  
            mMediaPlayer.setLooping(isLoop);  
            // 设置进度条最大值  
            TestMediaPlayer.audioSeekBar.setMax(PlayerService.mMediaPlayer  
                    .getDuration());  
            new Thread(this).start();  
        } catch (IOException e) {  
        }  
  
    }  
  
    // 刷新进度条  
    @Override  
    public void run() {  
        int CurrentPosition = 0;// 设置默认进度条当前位置  
        int total = mMediaPlayer.getDuration();//  
        while (mMediaPlayer != null && CurrentPosition < total) {  
            try {  
                Thread.sleep(1000);  
                if (mMediaPlayer != null) {  
                    CurrentPosition = mMediaPlayer.getCurrentPosition();  
                }  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
            TestMediaPlayer.audioSeekBar.setProgress(CurrentPosition);  
        }  
  
    }  
  
    @Override  
    public void onCompletion(MediaPlayer mp) {  
        /* 播放完当前歌曲,自动播放下一首 */  
  
        if (++TestMediaPlayer.currentListItme >= TestMediaPlayer.mMusicList  
                .size()) {  
            Toast.makeText(PlayerService.this, "已到最后一首歌曲", Toast.LENGTH_SHORT)  
                    .show();  
            TestMediaPlayer.currentListItme--;  
            TestMediaPlayer.audioSeekBar.setMax(0);  
        } else {  
            playMusic();  
        }  
    }  
}  

 参数封装

 

/** 
 * @把参数这样封装易于管理和阅读 
 * 
 */  
public interface AppConstant {  
    public class PlayerMag{  
        public static final int PLAY_MAG=1;//开始播放  
        public static final int PAUSE=2;//暂停播放  
    }  
}  
分享到:
评论

相关推荐

    android开发MediaPlayer+Service MP3音乐播放器

    在Android应用开发中,创建一个功能完备的MP3音乐播放器是常见的需求,尤其是在移动设备上享受音乐体验已经成为用户的基本需求。本项目基于Android的`MediaPlayer`类和`Service`组件,实现了一个具有多种功能的音乐...

    SurfaceView+MediaPlayer视频播放以及小窗口和全屏播放

    在Android开发中,实现视频播放是一项常见的需求。`SurfaceView`和`MediaPlayer`是Android系统提供的两个关键组件,用于高效地处理视频播放任务。本文将深入探讨如何利用这两个组件实现视频播放,包括小窗口(悬浮...

    Android应用开发-MP3音乐播放器源码

    【Android应用开发-MP3音乐播放器源码】 在Android平台上开发一款MP3音乐播放器是一项常见的任务,它涉及到多媒体处理、用户界面设计以及设备硬件交互等多个方面。本项目"Android应用开发-MP3音乐播放器源码"提供了...

    Android在Service里的播放器

    这个“Android在Service里的播放器”主题主要涉及三个关键组件:MediaPlayer、Service以及播放器的控制和管理。 首先,我们来了解一下`MediaPlayer`类。它是Android SDK提供的一种用于播放各种音频和视频流的API。...

    Android 带进度条的使用Service实现的音乐播放器

    在Android开发中,创建一个带有进度条的音乐播放器是一个常见的需求。本项目"Android 带进度条的使用Service实现的音乐播放器"聚焦于如何在后台Service中使用MediaPlayer类来实现音乐播放,并结合UI界面展示播放进度...

    android studio手机MP3音乐播放器

    【Android Studio 手机MP3音乐播放器】是一款基于Android Studio开发的应用程序,它允许用户在他们的智能手机上播放MP3格式的音乐文件。这个项目涵盖了Android应用开发的基础知识,包括UI设计、媒体处理、文件操作...

    Android Mp3播放器源码

    在Android平台上开发一款MP3播放器是一个常见的任务,涉及到许多核心技术和组件的使用。这款名为"Android Mp3播放器源码"的项目提供了一个宝贵的参考资料,让我们深入探讨一下其中涉及的关键知识点。 首先,Android...

    Android 中级教程之------Android MediaPlayer播放mp3的实例

    在Android开发中,MediaPlayer是一个非常重要的组件,它用于播放各种媒体资源,如音频和视频文件。本教程将深入探讨如何使用Android的MediaPlayer类来播放MP3格式的音频文件。了解这个知识点对于Android开发者来说至...

    Android 开发源码分享之在线音乐播放器完整项目.rar

    首先,我们要了解Android开发的基础知识。Android是由Google主导开发的开源移动操作系统,它基于Linux内核,支持各种移动设备,如智能手机和平板电脑。开发者通常使用Java或Kotlin语言进行编程,并利用Android ...

    Android 开发源码分享之在线音乐播放器完整项目.zip

    在本项目中,我们探索的是一个基于Android平台的在线音乐播放器的完整开发源码。这个项目涵盖了Android应用开发中的多个重要知识点,...通过研究源码,你可以掌握实际项目中的最佳实践,提升自己的Android开发技能。

    Android 音乐播放器+视频播放器

    在Android平台上,开发一款音乐播放器和视频播放器是相当常见的任务,这涉及到对多媒体文件的处理、用户界面设计...这是一个很好的起点,对于想要在Android开发领域深化学习的初学者来说,这将是一份宝贵的参考资料。

    mooc_android_lesson16_Service音乐播放器

    在Android开发中,Service是一种非常重要的组件,它可以在后台长时间运行,即使用户离开了应用程序界面,Service仍然可以继续执行任务。本课程"mooc_android_lesson16_Service音乐播放器"聚焦于如何利用Service来...

    Android实现简单音乐播放器(MediaPlayer)

    Android实现简单音乐播放器(MediaPlayer),供大家参考,具体内容如下 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能有: 播放、暂停功能; 进度条显示...

    Mp3播放器源码,android实战项目源码,android ,mars老师的MP3项目

    在Android平台上,开发一个功能完善的MP3播放器需要掌握一系列的技术点。本篇将基于"Mars老师的MP3项目"源码,深入探讨Android MP3播放器的实现细节。 1. **音频框架基础** Android的音频处理主要依赖于Android ...

    android编写的简易mp3播放器

    在Android平台上,开发一个简易的MP3播放器是一项常见的任务,尤其对于初学者来说,它是一个很好的实践项目,能够帮助理解Android系统的核心组件和服务。在这个项目中,我们主要会涉及两个关键组件:服务(Service)...

    mars android mp3播放器源码

    在Android平台上,开发一款MP3播放器是一项常见的任务,尤其对于那些热衷于学习移动应用开发的程序员来说,它既是一次挑战,也是提升技能的好机会。本文将深入探讨"Mars Android MP3播放器"的源码,帮助开发者理解其...

    android实例源代码-Android MP3播放器,带卡拉OK字幕.zip

    在Android平台上开发一款MP3播放器并集成卡拉OK字幕是一项技术挑战...通过分析这个压缩包中的源代码,开发者不仅可以学习到以上技术,还能了解到实际项目中的最佳实践和问题解决方案,从而提升自己的Android开发技能。

    android 简易MP3播放器

    1. **环境配置**:首先,确保你有安装了Android Studio的开发环境,它提供了完整的Android开发工具链,包括集成开发环境(IDE)、Android SDK、构建工具等。 2. **AndroidManifest.xml**:在项目的根目录下,这个...

    android系统mp3播放器开发源码

    在Android平台上开发一个MP3播放器涉及...通过这个源码,你可以学习到如何将以上知识点有效地整合到一个实际项目中,这对于提升Android开发技能非常有帮助。同时,分析和调试源码也能加深对Android系统底层机制的理解。

    基于Android Studio开发的音乐播放器APP源码Android 音乐播放器源码

    通过分析这个基于Android Studio的音乐播放器源码,开发者不仅可以学习到如何构建一个完整的音乐播放应用,还能深入理解Android平台上的多媒体处理、用户界面设计、服务组件使用等核心概念,为今后的Android开发打下...

Global site tag (gtag.js) - Google Analytics