一个完整android音乐播放器源码
Android简易音乐播放器实现代码

Android简易⾳乐播放器实现代码本⽂实例为⼤家分享了Android⾳乐播放器的具体代码,供⼤家参考,具体内容如下1.播放项⽬内的⾳乐package com.thm.g150820_android26_playmusic;import Android.media.MediaPlayer;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.ImageButton;import android.widget.SeekBar;public class MainActivity extends AppCompatActivity {private MediaPlayer mediaPlayer;private SeekBar seekBar;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);seekBar = (SeekBar) findViewById(R.id.seekBar);seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {//获取拖动结束之后的位置int progress = seekBar.getProgress();//跳转到某个位置播放mediaPlayer.seekTo(progress);}});}public void isPlayOrPause(View view){//把View强转为ImageButtonImageButton imageButton = (ImageButton) view;if(mediaPlayer==null) {//实例化MediaPlayermediaPlayer = MediaPlayer.create(this, R.raw.yao);//开始播放mediaPlayer.start();//图标修改为暂停的图标imageButton.setImageResource(android.R.drawable.ic_media_pause);//获取⾳乐的总时长int duration = mediaPlayer.getDuration();//设置进度条的最⼤值为⾳乐的总时长seekBar.setMax(duration);new MyThre().start();}//判断如果⾳乐在播放else if(mediaPlayer.isPlaying()){//就暂停⾳乐mediaPlayer.pause();//图标修改为播放的图标imageButton.setImageResource(android.R.drawable.ic_media_play);}else{mediaPlayer.start();//图标修改为暂停的图标imageButton.setImageResource(android.R.drawable.ic_media_pause);}}//写内部类class MyThre extends Thread{@Overridepublic void run() {super.run();while(seekBar.getProgress()<=seekBar.getMax()){//获取当前⾳乐播放的位置int currentPosition = mediaPlayer.getCurrentPosition();//让进度条动起来seekBar.setProgress(currentPosition);}}}}2.播放内存卡中的⾳乐package com.thm.g150820_android26_playmusic;import android.media.AudioManager;import android.media.MediaPlayer;import .Uri;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.ImageButton;import android.widget.SeekBar;import java.io.IOException;public class MainActivity extends AppCompatActivity {private MediaPlayer mediaPlayer;private SeekBar seekBar;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);seekBar = (SeekBar) findViewById(R.id.seekBar);seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { }@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {//获取拖动结束之后的位置int progress = seekBar.getProgress();//跳转到某个位置播放mediaPlayer.seekTo(progress);}});}public void isPlayOrPause(View view){//把View强转为ImageButtonImageButton imageButton = (ImageButton) view;if(mediaPlayer==null) {//实例化MediaPlayer//播放应⽤内的⾳乐//mediaPlayer = MediaPlayer.create(this, R.raw.yao);//播放内存卡中的⾳乐mediaPlayer = new MediaPlayer();//设置类型mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置⾳乐路径try {mediaPlayer.setDataSource(this, Uri.parse("storage/sdcard0/Music/a.mp3"));//播放之前准备⼀下mediaPlayer.prepare();} catch (IOException e) {e.printStackTrace();}//开始播放mediaPlayer.start();//图标修改为暂停的图标imageButton.setImageResource(android.R.drawable.ic_media_pause);//获取⾳乐的总时长int duration = mediaPlayer.getDuration();//设置进度条的最⼤值为⾳乐的总时长seekBar.setMax(duration);new MyThre().start();}//判断如果⾳乐在播放else if(mediaPlayer.isPlaying()){//就暂停⾳乐mediaPlayer.pause();//图标修改为播放的图标imageButton.setImageResource(android.R.drawable.ic_media_play);}else{mediaPlayer.start();//图标修改为暂停的图标imageButton.setImageResource(android.R.drawable.ic_media_pause);}}//写线程内部类class MyThre extends Thread{@Overridepublic void run() {super.run();while(seekBar.getProgress()<=seekBar.getMax()){//获取当前⾳乐播放的位置int currentPosition = mediaPlayer.getCurrentPosition();//让进度条动起来seekBar.setProgress(currentPosition);}}}}3.添加读取内存的权限更多关于播放器的内容请点击进⾏学习。
Android下MP3播放器的实现源代码

MusicInfoController.javapackage com.yarin.android.MusicPlayer;import android.content.ContentResolver;import android.database.Cursor;import .Uri;import android.provider.MediaStore;public class MusicInfoController{private static MusicInfoController mInstance = null;private MusicPlayerApp pApp = null;public static MusicInfoController getInstance(MusicPlayerApp app){if (mInstance == null){mInstance = new MusicInfoController(app);}return mInstance;}private MusicInfoController(MusicPlayerApp app){pApp = app;}public MusicPlayerApp getMusicPlayer(){return pApp;}private Cursor query(Uri uri, String[] prjs, String selections, String[] selectArgs, String order){ ContentResolver resolver = pApp.getContentResolver();if (resolver == null){return null;}return resolver.query(uri, prjs, selections, selectArgs, order);}public Cursor getAllSongs(){return query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);MusicList.javapackage com.yarin.android.MusicPlayer;import android.app.ListActivity;import android.content.BroadcastReceiver;import ponentName;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.ServiceConnection;import android.database.Cursor;import android.os.Bundle;import android.os.IBinder;import android.provider.MediaStore;import android.view.View;import android.widget.Button;import android.widget.ListAdapter;import android.widget.ListView;import android.widget.SimpleCursorAdapter;import android.widget.T extView;public class MusicList extends ListActivity{private MusicPlayerService mMusicPlayerService = null;private MusicInfoController mMusicInfoController = null;private Cursor mCursor = null;private TextView mTextView = null;private Button mPlayPauseButton = null;private Button mStopButton = null;private ServiceConnection mPlaybackConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { mMusicPlayerService = ((MusicPlayerService.LocalBinder)service).getService();}public void onServiceDisconnected(ComponentName className){ mMusicPlayerService = null;}};protected BroadcastReceiver mPlayerEvtReceiver = new BroadcastReceiver() { @Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(MusicPlayerService.PLAYER_PREPARE_END)) {// will begin to playmTextView.setVisibility(View.INVISIBLE); mPlayPauseButton.setVisibility(View.VISIBLE);mStopButton.setVisibility(View.VISIBLE);mPlayPauseButton.setText(R.string.pause);} else if(action.equals(MusicPlayerService.PLAY_COMPLETED)){ mPlayPauseButton.setText(R.string.play);}}};public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.list_layout);MusicPlayerApp musicPlayerApp=(MusicPlayerApp)getApplication(); mMusicInfoController =(musicPlayerApp).getMusicInfoController();// bind playback servicestartService(new Intent(this,MusicPlayerService.class));bindService(new Intent(this,MusicPlayerService.class), mPlaybackConnection,Context.BIND_AUTO_CREATE);mTextView = (TextView)findViewById(R.id.show_text); mPlayPauseButton = (Button)findViewById(R.id.play_pause_btn); mStopButton = (Button) findViewById(R.id.stop_btn);mPlayPauseButton.setOnClickListener(new Button.OnClickListener() {public void onClick(View v) {// Perform action on clickif (mMusicPlayerService != null && mMusicPlayerService.isPlaying()) { mMusicPlayerService.pause();mPlayPauseButton.setText(R.string.play);} else if (mMusicPlayerService != null){mMusicPlayerService.start();mPlayPauseButton.setText(R.string.pause);}}});mStopButton.setOnClickListener(new Button.OnClickListener() {public void onClick(View v) {// Perform action on clickif (mMusicPlayerService != null ) {mTextView.setVisibility(View.VISIBLE);mPlayPauseButton.setVisibility(View.INVISIBLE);mStopButton.setVisibility(View.INVISIBLE); mMusicPlayerService.stop();}}});IntentFilter filter = new IntentFilter();filter.addAction(MusicPlayerService.PLAYER_PREPARE_END);filter.addAction(MusicPlayerService.PLAY_COMPLETED);registerReceiver(mPlayerEvtReceiver, filter);}protected void onResume() {super.onResume();mCursor = mMusicInfoController.getAllSongs();ListAdapter adapter = new MusicListAdapter(this,yout.simple_expandable_list_item_2, mCursor, new String[]{}, new int[]{});setListAdapter(adapter);}protected void onListItemClick(ListView l, View v, int position, long id) {super.onListItemClick(l, v, position, id);if (mCursor == null ||mCursor.getCount() == 0) {return;}mCursor.moveToPosition(position);String url = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));mMusicPlayerService.setDataSource(url);mMusicPlayerService.start();}/********************************************************************/class MusicListAdapter extends SimpleCursorAdapter {public MusicListAdapter(Context context, int layout, Cursor c,String[] from, int[] to) { super(context, layout, c, from, to);}public void bindView(View view, Context context, Cursor cursor) {super.bindView(view, context, cursor);TextView titleView = (TextView) view.findViewById(android.R.id.text1);TextView artistView = (TextView) view.findViewById(android.R.id.text2);titleView.setText(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)));artistView.setText(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)));//int duration cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));}public static String makeTimeString(long milliSecs) {StringBuffer sb = new StringBuffer();long m = milliSecs / (60 * 1000);sb.append(m < 10 ? "0" + m : m);sb.append(":");long s = (milliSecs % (60 * 1000)) / 1000;sb.append(s < 10 ? "0" + s : s);return sb.toString();}MusicPlayerApp.java package com.yarin.android.MusicPlayer;import android.app.Application;public class MusicPlayerApp extends Application{private MusicInfoController mMusicInfoController = null;public void onCreate(){ super.onCreate();mMusicInfoController = MusicInfoController.getInstance(this); }public MusicInfoController getMusicInfoController(){return mMusicInfoController;}}MusicPlayerService.javapackage com.yarin.android.MusicPlayer;import java.io.IOException;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.os.Binder;import android.os.IBinder;public class MusicPlayerService extends Service{private final IBinder mBinder = new LocalBinder();private MediaPlayer mMediaPlayer = null;public static final String PLAYER_PREPARE_END = "com.yarin.musicplayerservice.prepared";public static final String PLAY_COMPLETED = "com.yarin.musicplayerservice.playcompleted";MediaPlayer.OnCompletionListener mCompleteListener = new MediaPlayer.OnCompletionListener(){public void onCompletion(MediaPlayer mp){ broadcastEvent(PLAY_COMPLETED);}};MediaPlayer.OnPreparedListener mPrepareListener = new MediaPlayer.OnPreparedListener(){public void onPrepared(MediaPlayer mp){ broadcastEvent(PLAYER_PREPARE_END);}};private void broadcastEvent(String what){Intent i = new Intent(what); sendBroadcast(i);}public void onCreate(){super.onCreate();mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnPreparedListener(mPrepareListener);mMediaPlayer.setOnCompletionListener(mCompleteListener);}public class LocalBinder extends Binder{public MusicPlayerService getService(){return MusicPlayerService.this;public IBinder onBind(Intent intent){return mBinder;}public void setDataSource(String path){try{mMediaPlayer.reset();mMediaPlayer.setDataSource(path); mMediaPlayer.prepare();}catch (IOException e){return;}catch (IllegalArgumentException e){return;}}public void start(){mMediaPlayer.start();}public void stop(){mMediaPlayer.stop();}public void pause(){mMediaPlayer.pause();public boolean isPlaying(){return mMediaPlayer.isPlaying();}public int getDuration(){return mMediaPlayer.getDuration();}public int getPosition(){return mMediaPlayer.getCurrentPosition();}public long seek(long whereto){mMediaPlayer.seekTo((int) whereto);return whereto;}}。
安卓音乐播放器实现代码

1. Mp3Player.java 文件package com.jacky.multimedia;import java.io.File;import java.io.FilenameFilter;import java.io.IOException;import java.util.ArrayList;import java.util.List;import android.app.ListActivity;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.os.Bundle;import android.os.Handler;import android.view.KeyEvent;import android.view.View;import android.widget.ArrayAdapter;import android.widget.ImageButton;import android.widget.ListView;import android.widget.SeekBar;import android.widget.SeekBar.OnSeekBarChangeListener;import android.widget.TextView;public class Mp3Player extends ListActivity {/** Called when the activity is first created. *//* 定义5个图像按钮*/private ImageButton mFrontImageButton = null;private ImageButton mStartImageButton = null;private ImageButton mPauseImageButton = null;private ImageButton mStopImageButton = null;private ImageButton mNextImageButton = null;/*定义进度handler,显示百分比进度*/Handler mPercentHandler = new Handler();/*定义拖动条*/private SeekBar mSeekBar=null;/*定义显示文本框*/private TextView curProgressText=null;private TextView curtimeAndTotaltime=null;/* 定于一个多媒体对象*/public MediaPlayer mMediaPlayer = null;/*定于一个数据播放列表,用来存放从指定文件中搜索到的文件*/private List<String> mMusicList = new ArrayList<String>();/* 定义在播放列表中的当前选择项*/private int currentListItme = 0;/*定义要播放的文件夹路径*/private static final String MUSIC_PATH = new String("/mnt/sdcard/");/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(yout.main);/* 更新播放列表*/musicList();/*初始化多媒体对象*/mMediaPlayer = new MediaPlayer();/*初始化图像按钮*/mFrontImageButton = (ImageButton) findViewById(stImageButton); mStopImageButton = (ImageButton) findViewById(R.id.StopImageButton); mStartImageButton = (ImageButton) findViewById(R.id.StartImageButton); mPauseImageButton = (ImageButton) findViewById(R.id.PauseImageButton); mNextImageButton = (ImageButton) findViewById(R.id.NextImageButton);/*初始化拖动条和当前进度显示值*/mSeekBar=(SeekBar)findViewById(R.id.SeekBar01);curProgressText=(TextView)findViewById(R.id.currentProgress); curtimeAndTotaltime=(TextView)findViewById(R.id.curtimeandtotaltime);/*监听停止按钮*/mStopImageButton.setOnClickListener(new ImageButton.OnClickListener() {@Overridepublic void onClick(View v){/*判断是否正在播放歌曲*/if (mMediaPlayer.isPlaying()){/*如果在播放歌曲时,按下开始按钮,则重开开始播放*/mMediaPlayer.reset();}}});/*监听开始按钮*/mStartImageButton.setOnClickListener(new ImageButton.OnClickListener(){@Overridepublic void onClick(View v){ /*播放当前选择歌曲,通过listView列表中onListItemClick方法得到选择的时第几项*/playMusic(MUSIC_PATH + mMusicList.get(currentListItme));/*开始播放歌曲时,同步进行更新拖动条进度*/startSeekBarUpdate();}});/*监听暂停按钮*/mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener(){public void onClick(View view){if (mMediaPlayer.isPlaying()){/*如果有播放歌曲,暂停*/mMediaPlayer.pause();}else{/*如果没有播放歌曲,则开始播放*/mMediaPlayer.start();}}});/*监听下一首按钮*/mNextImageButton.setOnClickListener(new ImageButton.OnClickListener(){@Overridepublic void onClick(View arg0){nextMusic();}/*监听上一首按钮*/mFrontImageButton.setOnClickListener(new ImageButton.OnClickListener() {@Overridepublic void onClick(View arg0){FrontMusic();}});/*监听拖动条*/mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {// TODO Auto-generated method stub/*如果拖动进度发生改变,则显示当前进度值*/curProgressText.setText("当前进度: "+progress);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stubcurProgressText.setText("拖动中...");}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stubint dest = seekBar.getProgress();int mMax = mMediaPlayer.getDuration();int sMax = mSeekBar.getMax();mMediaPlayer.seekTo(mMax*dest/sMax);}});}/*按键处理时间,当按下返回按键时的处理方法*/public boolean onKeyDown(int keyCode, KeyEvent event){if ( keyCode == KeyEvent.KEYCODE_BACK){mMediaPlayer.stop();mMediaPlayer.release();this.finish();return true;}return super.onKeyDown(keyCode, event);}/*ListView选择项监听方法,即当前鼠标在列表中选择的第几项*/protected void onListItemClick(ListView l, View v, int position, long id){currentListItme = position;playMusic(MUSIC_PATH + mMusicList.get(position));}/*更新播放列表*/public void musicList(){/*从指定的路径中读取文件,并与播放列表关联*/File home = new File(MUSIC_PATH);/*读取指定类型的文件,在本程序,指定播放类型为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>(Mp3Player.this,yout.musicitme, mMusicList); setListAdapter(musicList);}}/*播放指定路径中的音乐*/private void playMusic(String path){{/* 重置多媒体*/mMediaPlayer.reset();/*读取mp3文件*/mMediaPlayer.setDataSource(path);/*准备播放*/mMediaPlayer.prepare();/*开始播放*/mMediaPlayer.start();/*监听播放是否完成*/mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {public void onCompletion(MediaPlayer arg0){/*播放完当前歌曲,自动播放下一首*/nextMusic();}});}catch (IOException e){}}/*播放下一首*/private void nextMusic(){if (++currentListItme >= mMusicList.size()){currentListItme = 0;}else{playMusic(MUSIC_PATH + mMusicList.get(currentListItme));}}/*播放上一首歌曲*/private void FrontMusic(){if (--currentListItme >= 0){currentListItme = 0;}{playMusic(MUSIC_PATH + mMusicList.get(currentListItme));}}/*更新拖动条进度*/public void startSeekBarUpdate(){mPercentHandler.post(start);}Runnable start=new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubmPercentHandler.post(updatesb);//用一个handler更新SeekBar}};Runnable updatesb =new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubint position = mMediaPlayer.getCurrentPosition();int mMax = mMediaPlayer.getDuration();int sMax = mSeekBar.getMax();mSeekBar.setProgress(position*sMax/mMax);curtimeAndTotaltime.setT ext("当前播放时间:"+position/1000+"秒"+"\n歌曲总时间: "+mMax/1000+"秒");mPercentHandler.postDelayed(updatesb, 1000);//每秒钟更新一次}};}/*播放文件选择类*/class MusicFilter implements FilenameFilter{public boolean accept(File dir, String name){/*指定扩展名类型*/return (name.endsWith(".mp3"));}}2.main.xls文件<?xml version="1.0" encoding="utf-8"?><AbsoluteLayoutxmlns:android="/apk/res/android" android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><ListViewandroid:id="@id/android:list"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="1"android:drawSelectorOnT op="false"/><ImageButtonandroid:id="@+id/LastImageButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_x="10px"android:layout_y="70px"android:src="@drawable/last"/><ImageButtonandroid:id="@+id/StopImageButton"android:layout_height="wrap_content"android:layout_width="wrap_content"android:layout_x="70px"android:layout_y="70px"android:src="@drawable/stop"/><ImageButtonandroid:id="@+id/StartImageButton"android:layout_height="wrap_content"android:layout_width="wrap_content"android:layout_x="130px"android:layout_y="70px"android:src="@drawable/start"/><ImageButtonandroid:id="@+id/PauseImageButton"android:layout_height="wrap_content"android:layout_width="wrap_content"android:layout_x="190px"android:layout_y="70px"android:src="@drawable/pause"/><ImageButtonandroid:id="@+id/NextImageButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_x="250px"android:layout_y="70px"android:src="@drawable/next"/><SeekBar android:id="@+id/SeekBar01"android:layout_height="wrap_content"android:layout_x="0dp"android:layout_y="200dp"android:layout_width="fill_parent"android:max="100"android:progress="0"android:secondaryProgress="50"android:visibility="visible"></SeekBar><TextView android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_y="250dp" android:id="@+id/currentProgress"></TextView><TextView android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_y="300dp" android:id="@+id/curtimeandtotaltime"></TextView></AbsoluteLayout>3.musictime.xls<?xml version="1.0" encoding="utf-8"?><TextView xmlns:android="/apk/res/android" android:id="@+id/T extView01"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello"/>4.AndroidManifest.xls<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android" package="com.jacky.multimedia"android:versionCode="1"android:versionName="1.0"><application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Mp3Player"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="UNCHER" /></intent-filter></activity></application><uses-sdk android:minSdkVersion="3" /></manifest>。
Android手机平台音乐播放器策划方案和源代码

目录第一章引言................................................................................................... - 1 -1.1 项目背景............................................................................................ - 1 -1.2 编写目的............................................................................................ - 2 -1.3 参考资料............................................................... 错误!未定义书签。
第二章系统需求分析..................................................................................... - 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.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 - 第六章结论...................................................................... 错误!未定义书签。
黑马程序员安卓教程:音乐播放器之编写框架

黑马程序员安卓教程:音乐播放器之编写框架我们已了解Service的原理和使用方法,下面就通过一个综合的案例来进一步掌握Service在项目中的编写方法。
设计需求:编写一个音乐播放器项目,实现功能:列表展示待播放的音乐,当点击列表中的某一条音乐时则后台开启一个服务用来播放该音乐。
具体实现步骤如下:1.新建工程【File】→【new】→【Android Application Project】命名为:03_百度音乐盒2.编写布局文件根据需求编写布局,效果如图1-1所示:图1-1所示图1-1对应的xml布局代码如例1-1:3.查找控件在主Activity中,根据控件的ID查找相关控件,代码如例1-2:4.编写实体bean新建一个包(com.itheima.baidubox.domain),在该包下新建一实体bean,用来封装每一首音乐信息。
代码如例1-3:例1-3例1-3是一个实体类,我们定义了该实体的name属性和path属性,并重写了其get方法和set方法。
同时,还在重写了该类的构造方法(无参构造方法和有参构造方法)。
5.编写适配器ListView 要展示待播放的音乐,我们需要调用ListView的setAdapter方法将待播放音乐部署到该ListView中。
具体步骤如下:模拟ListView数据源,代码如例1-4例1-4中new一个List 集合,然后向该集合中添加多个MusicInfo实体对象。
至此,数据源List集合已经编写完成,接下来就是编写适配器。
本例中,我们通过继承BaseAdapter来编写自己的适配器MyAdapter。
代码如例1-5所示:例1-5例1-5中MyAdapter继承BaseAdapter,并重写了getCount方法和getView方法,getCount方法返回了ListView列表中条目的数据,本例中就是数据源List集合的大小;getView方法返回了每一个条目的显示内容,本例new一个TextView用来展示待播放音乐的名称。
android音乐播放器---源代码

android:background="@drawable/bg1">
<TextView android:layout_x="93px" android:layout_height="wrap_content"
<TextView android:layout_x="145px" android:layout_height="wrap_content"
android:text="" android:layout_y="65px" android:id="@+id/current_music"
android:textSize="18px" android:textColor="#C0FF3E"
<dimen name="button_size">40px</dimen>
</resources>
color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="white">#ffffff</color>
android:layout_height="wrap_content" />
简单实现Android本地音乐播放器

简单实现Android本地⾳乐播放器⾳乐播放需要调⽤service,在此,只是简单梳理播放流程。
public class PlayMusicService extends Service {//绑定服务调⽤服务的⽅法。
@Overridepublic IBinder onBind(Intent intent) {return null;}}<LinearLayout xmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity" ><EditTextandroid:id="@+id/et_path"android:layout_width="fill_parent"android:layout_height="wrap_content"android:hint="请输⼊要播放⽂件的路径" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><Buttonandroid:id="@+id/bt_play"android:onClick="play"android:layout_width="0dip"android:layout_height="wrap_content"android:layout_weight="1"android:text="播放" /><Buttonandroid:id="@+id/bt_pause"android:onClick="pause"android:layout_width="0dip"android:layout_height="wrap_content"android:layout_weight="1"android:text="暂停" /><Buttonandroid:id="@+id/bt_stop"android:onClick="stop"android:layout_width="0dip"android:layout_height="wrap_content"android:layout_weight="1"android:text="停⽌" /><Buttonandroid:id="@+id/bt_replay"android:onClick="replay"android:layout_width="0dip"android:layout_height="wrap_content"android:layout_weight="1"android:text="重播" /></LinearLayout></LinearLayout>public class MainActivity extends Activity {private EditText et_path;private MediaPlayer mediaPlayer;private Button bt_play,bt_pause,bt_stop,bt_replay;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);et_path = (EditText) findViewById(R.id.et_path);bt_play = (Button) findViewById(R.id.bt_play);bt_pause = (Button) findViewById(R.id.bt_pause);bt_stop = (Button) findViewById(R.id.bt_stop);bt_replay = (Button) findViewById(R.id.bt_replay);}/*** 播放* @param view*/public void play(View view) {String filepath = et_path.getText().toString().trim();File file = new File(filepath);if(file.exists()){try {mediaPlayer = new MediaPlayer();mediaPlayer.setDataSource(filepath);//设置播放的数据源。
android音乐播放器代码

81.});
82.
83.forwardBtn.setOnTouchListener(new OnTouchListener() { //点击“快进”按钮时回调
84. @Override
85. public boolean onTouch(View v, MotionEvent event) {
01./*变量声明*/
02.private ImageButton playBtn = null;//播放、暂停
03.private ImageButton latestBtn = null;//上一首
04.private ImageButton nextButton = null;//下一首
37.playBtn.setOnClickListener(new View.OnClickListener() { //点击“播放、暂停”按钮时回调
38. @Override
39. public void onClick(View v) {
testBtn = (ImageButton)findViewById(testBtn); //播放上一首按钮
31.nextButton = (ImageButton)findViewById(R.id.nextBtn); //播放下一首按钮
32.forwardBtn = (ImageButton)findViewById(R.id.forwardBtn); //快进按钮
64. play(); //开始播放
65. }
66.});
67.
68.nextButton.setOnClickListener(new View.OnClickListener(){//点击“播放下一首”按钮时回调
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文出自:欢迎转载,转载请注明出自:安卓开发网下面将和大家一起介绍一个音乐播放器项目,完成后的播放器具有暂停,下一首,前一首,歌曲列表,播放条进度等一些基本功能,它只是播放SDCARD上的.map文件,Android SDK为我们提供了一个MeidaPlayer类,有了这个类我们可以很方便的创建一个mdeiaplayer服务,该类中具有一些方法:MediaPlayer mp = new MediaPlayer();// 设置文件存储路径setDataSource("/sdcard/path_to_song");// 播放mp.start();// 暂短mp.pause();// 复位mp.reset();// 获取当前播放时长mp.getDuration();// 进度条mp.getCurrentDuration();// Move song to particular second - used for Forward or Backwardmp.seekTo(positon); // position in milliseconds// 检测歌曲是否正在播放mp.isPlaying(); // returns true or false1:音乐播放器的界面:播放器界面中所用的一些布局图片,这些图片大家可以到android SDK文件夹下或是到网络中去寻找一些类似就可以,并不一定要这些图片,代码才是我们的关键,3:然后我们需要写一个XML布局文件用于播放器的播按钮在不同状态下的图片,此XML文件保存在drawable文件夹下,btn_play.xml<selector xmlns:android=""><item android:drawable="@drawable/img_btn_play_pressed"android:state_focused="true"android:state_pressed="true" /><item android:drawable="@drawable/img_btn_play_pressed"android:state_focused="false"android:state_pressed="true" /><item android:drawable="@drawable/img_btn_play_pressed"android:state_focused="true" /><item android:drawable="@drawable/img_btn_play"android:state_focused="false"android:state_pressed="false" /></selector>提示:大家可以根据此XML文件完成其它的一些按钮布局文件,在这里就没有再为大家一一提供了,4:为了让播放器更绚,我们可以自定义一个SeekBar作为歌曲的播放进度,自定义风格代如下:(4.1)更换背景图片:seekbar_progress_bg.xml<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android=""><item><clip><bitmap xmlns:android=""android:src="@drawable/img_seekbar_progress_blue"android:tileMode="repeat"android:antialias="true"android:dither="false"android:filter="false"android:gravity="left"/></clip></item>(4.2)Changing SeekBar Progress:seekbar_progress.xml<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android=""><item android:id="@android:id/background"android:drawable="@drawable/img_seekbar_bg"android:dither="true"></item><item android:id="@android:id/secondaryProgress"><clip><shape><gradientandroid:startColor="#80028ac8"android:centerColor="#80127fb1"android:centerY="0.75"android:endColor="#a004638f"android:angle="270"/></shape></clip></item><itemandroid:id="@android:id/progress"android:drawable="@drawable/seekbar_progress_bg"/></layer-list>(4.3)实际的Seekbar控件定义如下:<SeekBarandroid:id="@+id/songProgressBar"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginRight="20dp"android:layout_marginLeft="20dp"android:layout_marginBottom="20dp"android:layout_above="@id/player_footer_bg"android:thumb="@drawable/seek_handler"android:progressDrawable="@drawable/seekbar_progress"android:paddingLeft="6dp"android:paddingRight="6dp"/>5:接下来我们将实现播放的整体界面的布局文件:player.xml<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=""android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/player_background"><!-- Player Header --><LinearLayoutandroid:id="@+id/player_header_bg"android:layout_width="fill_parent"android:layout_height="60dip"android:background="@layout/bg_player_header"android:layout_alignParentTop="true"android:paddingLeft="5dp"android:paddingRight="5dp"><!-- Song Title --><TextViewandroid:id="@+id/songTitle"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:textColor="#04b3d2"android:textSize="16dp"android:paddingLeft="10dp"android:textStyle="bold"android:text="The Good, The Bad And The Ugly"android:layout_marginTop="10dp"/><!-- Playlist button --><ImageButtonandroid:id="@+id/btnPlaylist"android:layout_width="wrap_content"android:layout_height="fill_parent"android:src="@drawable/btn_playlist"android:background="@null"/></LinearLayout><!-- Song Thumbnail Image --><LinearLayoutandroid:id="@+id/songThumbnail"android:layout_width="fill_parent"android:layout_height="wrap_content"android:paddingTop="10dp"android:paddingBottom="10dp"android:gravity="center"android:layout_below="@id/player_header_bg"><ImageView android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/adele"/></LinearLayout><!-- Player Footer --><LinearLayoutandroid:id="@+id/player_footer_bg"android:layout_width="fill_parent"android:layout_height="100dp"android:layout_alignParentBottom="true" android:background="@layout/bg_player_footer" android:gravity="center"><!-- Player Buttons --><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"android:gravity="center_vertical"android:background="@layout/rounded_corner"android:paddingLeft="10dp"android:paddingRight="10dp"><!-- Previous Button --><ImageButtonandroid:id="@+id/btnPrevious"android:src="@drawable/btn_previous"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@null"/><!-- Backward Button --><ImageButtonandroid:id="@+id/btnBackward"android:src="@drawable/btn_backward"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@null"/><!-- Play Button --><ImageButtonandroid:id="@+id/btnPlay"android:src="@drawable/btn_play"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@null"/><!-- Forward Button --><ImageButtonandroid:id="@+id/btnForward"android:src="@drawable/btn_forward"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@null"/><!-- Next Button --><ImageButtonandroid:id="@+id/btnNext"android:src="@drawable/btn_next"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@null"/></LinearLayout></LinearLayout><!-- Progress Bar/Seek bar --><SeekBarandroid:id="@+id/songProgressBar"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginRight="20dp"android:layout_marginLeft="20dp"android:layout_marginBottom="20dp"android:layout_above="@id/player_footer_bg"android:thumb="@drawable/seek_handler"android:progressDrawable="@drawable/seekbar_progress"android:paddingLeft="6dp"android:paddingRight="6dp"/><!-- Timer Display --><LinearLayoutandroid:id="@+id/timerDisplay"android:layout_above="@id/songProgressBar"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginRight="20dp"android:layout_marginLeft="20dp"android:layout_marginBottom="10dp"><!-- Current Duration Label --><TextViewandroid:id="@+id/songCurrentDurationLabel"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="left"android:textColor="#eeeeee"android:textStyle="bold"/><!-- Total Duration Label --><TextViewandroid:id="@+id/songTotalDurationLabel"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="right"android:textColor="#04cbde"android:textStyle="bold"/></LinearLayout><!-- Repeat / Shuffle buttons --><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_above="@id/timerDisplay"android:gravity="center"><!-- Repeat Button --><ImageButtonandroid:id="@+id/btnRepeat"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/btn_repeat"android:layout_marginRight="5dp"android:background="@null"/><!-- Shuffle Button --><ImageButtonandroid:id="@+id/btnShuffle"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/btn_shuffle"android:layout_marginLeft="5dp"android:background="@null"/></LinearLayout></RelativeLayout>6:有了播放器的播放界面后,我们再将所有歌曲显示的界面实现了,播放器的歌曲列表用的一个listview控件,同样我们也为该listview控件自定义,适合播放的整体界面风格,list_selector.xml<?xml version="1.0" encoding="utf-8"?><selector xmlns:android=""><!-- Selector style for listrow --><itemandroid:state_selected="false"android:state_pressed="false"android:drawable="@drawable/gradient_bg" /><item android:state_pressed="true"android:drawable="@drawable/gradient_bg_hover" /><item android:state_selected="true"android:state_pressed="false"android:drawable="@drawable/gradient_bg_hover" /></selector>歌曲列表界面布局文件:playlist.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=""android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><ListViewandroid:id="@android:id/list"android:layout_width="fill_parent"android:layout_height="fill_parent"android:divider="#242424"android:dividerHeight="1dp"android:listSelector="@drawable/list_selector" /></LinearLayout>listviewr的item界面布局,用于定义单个歌曲的显示界面:playlist_item.xml<?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android=""android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"android:background="@drawable/list_selector"android:padding="5dp"><TextViewandroid:id="@+id/songTitle"android:layout_width="fill_parent"android:layout_height="wrap_content"android:textSize="16dp"android:padding="10dp"android:color="#f3f3f3"/></LinearLayout>歌曲列表界面图:7:到此为止我们在上面已经完成了该项目的所有布局文件,下面我们就来实现SongManager.java类,这个类用于扫描设备中所有.mp3文件,SongsManager.mp3public class SongsManager {// SDCard Pathfinal String MEDIA_PATH = new String("/sdcard/");private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();// Constructorpublic SongsManager(){}/*** Function to read all mp3 files from sdcard* and store the details in ArrayList* */public ArrayList<HashMap<String, String>> getPlayList(){= new );if (home.listFiles(new ()).length > 0) {for ( : home.listFiles(new ())) {HashMap<String, String> song = new HashMap<String, String>();song.put("songTitle", ().substring(0, (().length() - 4)));song.put("songPath", ());// Adding each song to SongListsongsList.add(song);}}// return songs list arrayreturn songsList;}/*** Class to filter files which are having .mp3 extension* */class implements {public boolean accept(, String name) {return (name.endsWith(".mp3") || name.endsWith(".MP3"));}}}8:创建一个新的Activity 类,该类用于显示在ongsManager.java中扫描到的所有歌曲,PlayListActivity.javapackage com.androidhive.musicplayer;import java.util.ArrayList;import java.util.HashMap;import android.app.ListActivity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListAdapter;import android.widget.ListView;import android.widget.SimpleAdapter;public class PlayListActivity extends ListActivity {// Songs listpublic ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.playlist);ArrayList<HashMap<String, String>> songsListData = new ArrayList<HashMap<String, String>>();SongsManager plm = new SongsManager();// get all songs from sdcardthis.songsList = plm.getPlayList();// looping through playlistfor (int i = 0; i < songsList.size(); i++) {// creating new HashMapHashMap<String, String> song = songsList.get(i);// adding HashList to ArrayListsongsListData.add(song);}// Adding menuItems to ListViewListAdapter adapter = new SimpleAdapter(this, songsListData,yout.playlist_item, new String[] { "songTitle" }, new int[] {R.id.songTitle });setListAdapter(adapter);// selecting single ListView itemListView lv = getListView();// listening to single listitem clicklv.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {// getting listitem indexint songIndex = position;// Starting new intentIntent in = new Intent(getApplicationContext(),AndroidBuildingMusicPlayerActivity.class);// Sending songIndex to PlayerActivityin.putExtra("songIndex", songIndex);setResult(100, in);// Closing PlayListViewfinish();}});}}9:下面我们再来实现播放的主类AndroidBuildingMusicPlayerActivity.java:该类主要实现功能如下:1:在歌曲列表界面点击一首歌曲进入播放界面;2:播放,暂停,快进,复位等功能实现3:重复播放单一歌曲,随机播放等该类的完整代码如下:public class AndroidBuildingMusicPlayerActivity extends Activity implements OnCompletionListener, SeekBar.OnSeekBarChangeListener {private ImageButton btnPlay;private ImageButton btnForward;private ImageButton btnBackward;private ImageButton btnNext;private ImageButton btnPrevious;private ImageButton btnPlaylist;private ImageButton btnRepeat;private ImageButton btnShuffle;private SeekBar songProgressBar;private TextView songTitleLabel;private TextView songCurrentDurationLabel;private TextView songTotalDurationLabel;// Media Playerprivate MediaPlayer mp;// Handler to update UI timer, progress bar etc,.private Handler mHandler = new Handler();;private SongsManager songManager;private Utilities utils;private int seekForwardTime = 5000; // 5000 millisecondsprivate int seekBackwardTime = 5000; // 5000 millisecondsprivate int currentSongIndex = 0;private boolean isShuffle = false;private boolean isRepeat = false;private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.player);// 所有的播放按钮btnPlay = (ImageButton) findViewById(R.id.btnPlay);btnForward = (ImageButton)findViewById(R.id.btnForward);btnBackward = (ImageButton)findViewById(R.id.btnBackward);btnNext = (ImageButton) findViewById(R.id.btnNext);btnPrevious = (ImageButton)findViewById(R.id.btnPrevious);btnPlaylist = (ImageButton)findViewById(R.id.btnPlaylist);btnRepeat = (ImageButton)findViewById(R.id.btnRepeat);btnShuffle = (ImageButton)findViewById(R.id.btnShuffle);songProgressBar = (SeekBar)findViewById(R.id.songProgressBar);songTitleLabel = (TextView)findViewById(R.id.songTitle);songCurrentDurationLabel = (TextView)findViewById(R.id.songCurrentDurationLabel);songTotalDurationLabel = (TextView)findViewById(R.id.songTotalDurationLabel);// Mediaplayermp = new MediaPlayer();songManager = new SongsManager();utils = new Utilities();// ListenerssongProgressBar.setOnSeekBarChangeListener(this); // Importantmp.setOnCompletionListener(this); // Important// 获取所有歌曲列表songsList = songManager.getPlayList();// 默认从第一首开始播放playSong(0);/*** Play button click event* plays a song and changes button to pause image* pauses a song and changes button to play image* */btnPlay.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {// check for already playingif(mp.isPlaying()){if(mp!=null){mp.pause();// Changing button image to play buttonbtnPlay.setImageResou rce(R.drawable.btn_play);}}else{// Resume songif(mp!=null){mp.start();// Changing button image to pause buttonbtnPlay.setImageResou rce(R.drawable.btn_pause);}}}});/*** Forward button click event* Forwards song specified seconds* */btnForward.setOnClickListener(newView.OnClickListener() {@Overridepublic void onClick(View arg0) {// get current song positionint currentPosition =mp.getCurrentPosition();// check if seekForward time is lesser than song durationif(currentPosition + seekForwardTime <= mp.getDuration()){// forward songmp.seekTo(currentPosition + seekForwardTime);}else{// forward to end positionmp.seekTo(mp.getDuration());}}});/*** Backward button click event* Backward song to specified seconds* */btnBackward.setOnClickListener(newView.OnClickListener() {@Overridepublic void onClick(View arg0) {// get current song positionint currentPosition =mp.getCurrentPosition();// check if seekBackward time is greater than 0 secif(currentPosition - seekBackwardTime >= 0){// forward songmp.seekTo(currentPosition - seekBackwardTime);}else{// backward to starting positionmp.seekTo(0);}}});/*** Next button click event*点击后一首歌事件* */btnNext.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {// check if next song is there or notif(currentSongIndex < (songsList.size() - 1)){playSong(currentSongIndex + 1);currentSongIndex = currentSongIndex + 1;}else{// play first songplaySong(0);currentSongIndex = 0;}}});/*** 单击:前一首按钮事件* */btnPrevious.setOnClickListener(newView.OnClickListener() {@Overridepublic void onClick(View arg0) {if(currentSongIndex > 0){playSong(currentSongIndex - 1);currentSongIndex = currentSongIndex - 1;}else{// play last songplaySong(songsList.size() - 1);currentSongIndex = songsList.size() - 1;}}});/***循环播放按钮事件* */btnRepeat.setOnClickListener(newView.OnClickListener() {@Overridepublic void onClick(View arg0) {if(isRepeat){isRepeat = false;Toast.makeText(getApplication Context(), "Repeat is OFF", Toast.LENGTH_SHORT).show();btnRepeat.setImageResource(R. drawable.btn_repeat);}else{// make repeat to trueisRepeat = true;Toast.makeText(getApplication Context(), "Repeat is ON", Toast.LENGTH_SHORT).show();// make shuffle to falseisShuffle = false;btnRepeat.setImageResource(R. drawable.btn_repeat_focused);btnShuffle.setImageResource(R .drawable.btn_shuffle);}}});/*** 随机播放按钮事件* */btnShuffle.setOnClickListener(newView.OnClickListener() {@Overridepublic void onClick(View arg0) {if(isShuffle){isShuffle = false;Toast.makeText(getApplication Context(), "Shuffle is OFF", Toast.LENGTH_SHORT).show();btnShuffle.setImageResource(R .drawable.btn_shuffle);}else{// make repeat to trueisShuffle= true;Toast.makeText(getApplication Context(), "Shuffle is ON", Toast.LENGTH_SHORT).show();// make shuffle to falseisRepeat = false;btnShuffle.setImageResource(R .drawable.btn_shuffle_focused);btnRepeat.setImageResource(R. drawable.btn_repeat);}}});/*** Button Click event for Play list click event* Launches list activity which displays list of songs* */btnPlaylist.setOnClickListener(newView.OnClickListener() {@Overridepublic void onClick(View arg0) {Intent i = newIntent(getApplicationContext(), PlayListActivity.class);startActivityForResult(i, 100);}});}/*** Receiving song index from playlist view* and play the song* */@Overrideprotected void onActivityResult(int requestCode,int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if(resultCode == 100){currentSongIndex =data.getExtras().getInt("songIndex");// play selected songplaySong(currentSongIndex);}}/*** Function to play a song* @param songIndex - index of song* */public void playSong(int songIndex){// Play songtry {mp.reset();mp.setDataSource(songsList.get(songIndex).get ("songPath"));mp.prepare();mp.start();// Displaying Song titleString songTitle =songsList.get(songIndex).get("songTitle");songTitleLabel.setText(songTitle);// Changing Button Image to pause imagebtnPlay.setImageResource(R.drawable.btn_pause );// set Progress bar valuessongProgressBar.setProgress(0);songProgressBar.setMax(100);// Updating progress barupdateProgressBar();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalStateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*** Update timer on seekbar* */public void updateProgressBar() {mHandler.postDelayed(mUpdateTimeTask, 100);}/*** Background Runnable thread* */private Runnable mUpdateTimeTask = new Runnable() {public void run() {long totalDuration = mp.getDuration();long currentDuration =mp.getCurrentPosition();// Displaying Total Duration timesongTotalDurationLabel.setText(""+utils .milliSecondsToTimer(totalDuration));// Displaying time completed playingsongCurrentDurationLabel.setText(""+uti liSecondsToTimer(currentDuration));// Updating progress barint progress =(int)(utils.getProgressPercentage(currentDuration, totalDuration));//Log.d("Progress", ""+progress);songProgressBar.setProgress(progress);// Running this thread after 100 millisecondsmHandler.postDelayed(this, 100);}};/**** */@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {}/*** When user starts moving the progress handler* */@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// remove message Handler from updating progress barmHandler.removeCallbacks(mUpdateTimeTask);}/*** When user stops moving the progress hanlder* */@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {mHandler.removeCallbacks(mUpdateTimeTask);int totalDuration = mp.getDuration();int currentPosition =utils.progressToTimer(seekBar.getProgress(), totalDuration);// forward or backward to certain secondsmp.seekTo(currentPosition);// update timer progress againupdateProgressBar();}/*** On Song Playing completed* if repeat is ON play same song again* if shuffle is ON play random song* */@Overridepublic void onCompletion(MediaPlayer arg0) {// check for repeat is ON or OFFif(isRepeat){// repeat is on play same song againplaySong(currentSongIndex);} else if(isShuffle){// shuffle is on - play a random songRandom rand = new Random();currentSongIndex =rand.nextInt((songsList.size() - 1) - 0 + 1) + 0;playSong(currentSongIndex);} else{// no repeat or shuffle ON - play next songif(currentSongIndex < (songsList.size() - 1)){playSong(currentSongIndex + 1);currentSongIndex = currentSongIndex + 1;}else{// play first songplaySong(0);currentSongIndex = 0;}}}@Overridepublic void onDestroy(){super.onDestroy();mp.release();}}10:项目的功能配置文件AndroidManifest.xmlAndroidManifest.xml<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android=""package="com.androidhive.musicplayer"android:versionCode="1"android:versionName="1.0" ><uses-sdk android:minSdkVersion="8" /><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name" ><activityandroid:name=".AndroidBuildingMusicPlayerActivity"android:label="@string/app_name"android:configChanges="keyboardHidden|orientation"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="UNCHER" /> </intent-filter></activity><activityandroid:name=".PlayListActivity" /></application></manifest>。