- 浏览: 108484 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
zhangchixtacbn:
能否发一份代码参考一下,谢谢。554242516@qq.com ...
DWZ整合struts2笔记 -
tuimaochang:
你好,这个有完整的源码吗?里面的对话框/图片资源用我自己的看不 ...
ActivityGroup + ViewPager 实现可滑动的底部Tab -
lintghi:
...
教你如何提高eclipse速度 -
119568242:
...
解决Bitmap读取频发OOM -
thunder_yan:
beat_it_ 写道能不能给份代码啊?上面不就是一个例子吗? ...
DWZ整合struts2笔记
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中,我们只需要管理Activity与Service间的通信就好了。下面就是个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 实现圆形Panel ListView
2012-12-04 18:32 1218(效果如上图所示) 其实很简单: 比方说上面的容 ... -
Android WIFI热点工具
2012-10-28 02:09 3361Hello Thunder夜未眠, 午夜时分, 发布一个小工具 ... -
Android 2.3+ 使用StrictMode
2012-09-21 14:47 0ANR窗口产生的原因是多种多样的。程序的主线程因为IO读 ... -
内存泄露 on Android
2012-09-21 14:41 10371.资源对象没关闭造成的内存泄漏 描述: 资源性对象 ... -
Android 高效编程
2012-09-21 14:36 12981.使用本地方法 当 ... -
Android, BaseAdapter 处理大数据量时的优化
2012-09-21 14:23 7298Android优化 最常见的就是ListView, Galle ... -
SQLite优化方法
2012-09-21 13:50 34081.建表优化 SQLite的数据库本质文件读写操作,频 ... -
Android SQLite插入优化
2012-09-21 13:48 1236最初代码如下,直接执行sql语句,外加事务提升性能: ... -
解决Bitmap读取频发OOM
2012-08-25 09:48 1197/** * Bitmap 工具包 * @author ... -
ActivityGroup + ViewPager 实现可滑动的底部Tab
2012-07-01 17:28 6810首先看看布局文件 main.xml <?xml ... -
Android 使用des算法
2012-06-11 14:09 1840import java.security.Key; i ... -
Android 自定义Toast显示图片
2012-06-11 14:08 2902Toast用于向用户显示一些帮助/提示。下面展示了5种效 ... -
Android TabActivity中onKeyDown无效问题
2012-06-11 14:04 34781.当继承TabActivity时,同学们是不是onKeyDo ... -
Android程序安装和卸载
2012-06-11 14:01 993安装: String str = "/Can ... -
Android 完全退出
2012-06-11 14:00 2482//通过context获取系统服务,得到Activity ... -
Android:创建网格状的RadioGroup
2012-06-05 10:37 3377Android系统自带的Radio ... -
Android: NDK编程
2012-06-05 10:32 5676为何要用到NDK? 概括来说主要分为以下几种情况: ... -
Android 3D图片切换
2012-06-05 10:25 2417MainActivity package org.wp ... -
android反编译和防止反编译的方法
2012-06-05 10:23 1455android基于java的,而ja ... -
Android怎么让一个service开机自动启动
2012-06-02 14:58 1801今天我们主要来探讨android怎么让一个service开机自 ...
相关推荐
Mediaplayer+Service实现的MP3播放器。 1、具有左右滑动屏效果 2、支持后台播放 3、进度条刷新 4、播放模式(顺序、循环、随机、单曲)选择及其他一些基本功能。
Android实现简单音乐播放器(MediaPlayer),供大家参考,具体内容如下 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能有: 播放、暂停功能; 进度条显示...
Android 开发技巧:音乐播放器的后台处理【Service、Handler、MediaPlayer】完整代码
delphi XE6 开发的Android 音乐播放器,只是一个示例,供参考
[Android应用开发记录-字幕播放器(5)完善]附属工程,源码 1.将操作按钮改成图标方式 2.有电话接入时暂停播放。 3.通过线控按钮控制播放,暂停,上一句歌词,下一句歌词功能。(Android2.2以上版本) 4.拔掉...
简单地实现播放器功能。使用MediaPlayer,简单的多线程编程,使用Handler 更新UI,简单的多线程编程,使用Handler 更新UI,使用Service 与Activity 进行通信
《Android开发案例驱动教程》 配套代码。 注: 由于第12,13,14章代码太大,无法上传到一个包中。 这三节代码会放到其他压缩包中。 作者:关东升,赵志荣 Java或C++程序员转变成为Android程序员 采用案例驱动模式...
<<Android应用开发记录-字幕播放器(4)完成>>配合的工程文件,源码,用于动作确认的歌曲及歌词 另外,工程是针对Android2.2建立的。 如果想在Android2.1运行,可以修改工程文件或从下面地址下载针对2.1做的安装包,...
用于【博客:Android应用开发记录-字幕播放器(3)使用的Service的音频播放器的】的工程文件及源码
Android应用开发记录-字幕播放器(5)完善附带工程,源码 1.将操作按钮改成图标方式 2.有电话接入时暂停播放。 3.通过线控按钮控制播放,暂停,上一句歌词,下一句歌词功能。(Android2.2以上版本) 4.拔掉耳机线时...
这是Android开发与应用,原书配套的课件,作者张荣,目录如下。 第1章 Android简介 1.1 手机操作系统 1.2 Android起源 1.3 Android特征 1.4 Android体系结构 1.4.1 应用层 1.4.2 应用框架层 1.4.3 ...
根据Service及BroadcastReceiver的知识讲解和案例使用,实现一个Android音乐播放器,强化对服务与广播的理解。要求能实现音乐的播放,暂停,上一首,下一首等功能。要求: 1. 巩固Android应用开发工具(Eclipse或者...
Google Android SDK开发范例大全(完整版)共4个分卷 目录 第1章 了解.深入.动手做. 1.1 红透半边天的Android 1.2 本书目的及涵盖范例范围 1.3 如何阅读本书 1.4 使用本书范例 1.5 参考网站 第2章 Android初体验 2.1...
Google Android SDK开发范例大全(完整版)共4个分卷 目录 第1章 了解.深入.动手做. 1.1 红透半边天的Android 1.2 本书目的及涵盖范例范围 1.3 如何阅读本书 1.4 使用本书范例 1.5 参考网站 第2章 Android初体验 2.1...
Google Android SDK开发范例大全(完整版)共4个分卷 目录 第1章 了解.深入.动手做. 1.1 红透半边天的Android 1.2 本书目的及涵盖范例范围 1.3 如何阅读本书 1.4 使用本书范例 1.5 参考网站 第2章 Android初体验 2.1...
7.13 内置影片播放器载入3gp电影——VideoViewWidget 7.14 自制3gp影片播放器——MediaPlayer与实现SurfaceView 7.15 相机预览及拍照临时文件——Camera及PictureCallback事件 第8章 当Android与Internet接轨 8.1 ...
7.10 播放存储卡里的mp3音乐——MediaPlayer.setDataSource 7.11 自制录音/播放录音程序——MediaRecorder与AudioEncoder 7.12 通过收到短信开始秘密录音——MediaRecorder与BroadcastReceiver实例 7.13 内置影片...
Google Android SDK开发范例大全(完整版) 包含部分书中源码 目录 第1章 了解.深入.动手做. 1.1 红透半边天的Android 1.2 本书目的及涵盖范例范围 1.3 如何阅读本书 1.4 使用本书范例 1.5 参考网站 第2章 ...