- 浏览: 112852 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
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 1364(效果如上图所示) 其实很简单: 比方说上面的容 ... -
Android WIFI热点工具
2012-10-28 02:09 3437Hello Thunder夜未眠, 午夜时分, 发布一个小工具 ... -
Android 2.3+ 使用StrictMode
2012-09-21 14:47 0ANR窗口产生的原因是多种多样的。程序的主线程因为IO读 ... -
内存泄露 on Android
2012-09-21 14:41 11061.资源对象没关闭造成的内存泄漏 描述: 资源性对象 ... -
Android 高效编程
2012-09-21 14:36 13651.使用本地方法 当 ... -
Android, BaseAdapter 处理大数据量时的优化
2012-09-21 14:23 7411Android优化 最常见的就是ListView, Galle ... -
SQLite优化方法
2012-09-21 13:50 34781.建表优化 SQLite的数据库本质文件读写操作,频 ... -
Android SQLite插入优化
2012-09-21 13:48 1374最初代码如下,直接执行sql语句,外加事务提升性能: ... -
解决Bitmap读取频发OOM
2012-08-25 09:48 1338/** * Bitmap 工具包 * @author ... -
ActivityGroup + ViewPager 实现可滑动的底部Tab
2012-07-01 17:28 6925首先看看布局文件 main.xml <?xml ... -
Android 使用des算法
2012-06-11 14:09 1929import java.security.Key; i ... -
Android 自定义Toast显示图片
2012-06-11 14:08 3048Toast用于向用户显示一些帮助/提示。下面展示了5种效 ... -
Android TabActivity中onKeyDown无效问题
2012-06-11 14:04 35581.当继承TabActivity时,同学们是不是onKeyDo ... -
Android程序安装和卸载
2012-06-11 14:01 1104安装: String str = "/Can ... -
Android 完全退出
2012-06-11 14:00 2583//通过context获取系统服务,得到Activity ... -
Android:创建网格状的RadioGroup
2012-06-05 10:37 3438Android系统自带的Radio ... -
Android: NDK编程
2012-06-05 10:32 5793为何要用到NDK? 概括来说主要分为以下几种情况: ... -
Android 3D图片切换
2012-06-05 10:25 2561MainActivity package org.wp ... -
android反编译和防止反编译的方法
2012-06-05 10:23 1616android基于java的,而ja ... -
Android怎么让一个service开机自动启动
2012-06-02 14:58 2010今天我们主要来探讨android怎么让一个service开机自 ...
相关推荐
在Android应用开发中,创建一个功能完备的MP3音乐播放器是常见的需求,尤其是在移动设备上享受音乐体验已经成为用户的基本需求。本项目基于Android的`MediaPlayer`类和`Service`组件,实现了一个具有多种功能的音乐...
在Android开发中,实现视频播放是一项常见的需求。`SurfaceView`和`MediaPlayer`是Android系统提供的两个关键组件,用于高效地处理视频播放任务。本文将深入探讨如何利用这两个组件实现视频播放,包括小窗口(悬浮...
【Android应用开发-MP3音乐播放器源码】 在Android平台上开发一款MP3音乐播放器是一项常见的任务,它涉及到多媒体处理、用户界面设计以及设备硬件交互等多个方面。本项目"Android应用开发-MP3音乐播放器源码"提供了...
这个“Android在Service里的播放器”主题主要涉及三个关键组件:MediaPlayer、Service以及播放器的控制和管理。 首先,我们来了解一下`MediaPlayer`类。它是Android SDK提供的一种用于播放各种音频和视频流的API。...
在Android开发中,创建一个带有进度条的音乐播放器是一个常见的需求。本项目"Android 带进度条的使用Service实现的音乐播放器"聚焦于如何在后台Service中使用MediaPlayer类来实现音乐播放,并结合UI界面展示播放进度...
【Android Studio 手机MP3音乐播放器】是一款基于Android Studio开发的应用程序,它允许用户在他们的智能手机上播放MP3格式的音乐文件。这个项目涵盖了Android应用开发的基础知识,包括UI设计、媒体处理、文件操作...
在Android平台上开发一款MP3播放器是一个常见的任务,涉及到许多核心技术和组件的使用。这款名为"Android Mp3播放器源码"的项目提供了一个宝贵的参考资料,让我们深入探讨一下其中涉及的关键知识点。 首先,Android...
在Android开发中,MediaPlayer是一个非常重要的组件,它用于播放各种媒体资源,如音频和视频文件。本教程将深入探讨如何使用Android的MediaPlayer类来播放MP3格式的音频文件。了解这个知识点对于Android开发者来说至...
首先,我们要了解Android开发的基础知识。Android是由Google主导开发的开源移动操作系统,它基于Linux内核,支持各种移动设备,如智能手机和平板电脑。开发者通常使用Java或Kotlin语言进行编程,并利用Android ...
在本项目中,我们探索的是一个基于Android平台的在线音乐播放器的完整开发源码。这个项目涵盖了Android应用开发中的多个重要知识点,...通过研究源码,你可以掌握实际项目中的最佳实践,提升自己的Android开发技能。
在Android平台上,开发一款音乐播放器和视频播放器是相当常见的任务,这涉及到对多媒体文件的处理、用户界面设计...这是一个很好的起点,对于想要在Android开发领域深化学习的初学者来说,这将是一份宝贵的参考资料。
在Android开发中,Service是一种非常重要的组件,它可以在后台长时间运行,即使用户离开了应用程序界面,Service仍然可以继续执行任务。本课程"mooc_android_lesson16_Service音乐播放器"聚焦于如何利用Service来...
Android实现简单音乐播放器(MediaPlayer),供大家参考,具体内容如下 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能有: 播放、暂停功能; 进度条显示...
在Android平台上,开发一个功能完善的MP3播放器需要掌握一系列的技术点。本篇将基于"Mars老师的MP3项目"源码,深入探讨Android MP3播放器的实现细节。 1. **音频框架基础** Android的音频处理主要依赖于Android ...
在Android平台上,开发一个简易的MP3播放器是一项常见的任务,尤其对于初学者来说,它是一个很好的实践项目,能够帮助理解Android系统的核心组件和服务。在这个项目中,我们主要会涉及两个关键组件:服务(Service)...
在Android平台上,开发一款MP3播放器是一项常见的任务,尤其对于那些热衷于学习移动应用开发的程序员来说,它既是一次挑战,也是提升技能的好机会。本文将深入探讨"Mars Android MP3播放器"的源码,帮助开发者理解其...
在Android平台上开发一款MP3播放器并集成卡拉OK字幕是一项技术挑战...通过分析这个压缩包中的源代码,开发者不仅可以学习到以上技术,还能了解到实际项目中的最佳实践和问题解决方案,从而提升自己的Android开发技能。
1. **环境配置**:首先,确保你有安装了Android Studio的开发环境,它提供了完整的Android开发工具链,包括集成开发环境(IDE)、Android SDK、构建工具等。 2. **AndroidManifest.xml**:在项目的根目录下,这个...
在Android平台上开发一个MP3播放器涉及...通过这个源码,你可以学习到如何将以上知识点有效地整合到一个实际项目中,这对于提升Android开发技能非常有帮助。同时,分析和调试源码也能加深对Android系统底层机制的理解。
通过分析这个基于Android Studio的音乐播放器源码,开发者不仅可以学习到如何构建一个完整的音乐播放应用,还能深入理解Android平台上的多媒体处理、用户界面设计、服务组件使用等核心概念,为今后的Android开发打下...