11.更新AndroidManifest.xml文件

添加android:configChanges=”keyboardHidden|orientation”, AndroidManifest.xml <?xml version="1.0"encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.androidhive.musicplayer" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <activity android:name=".AndroidBuildingMusicPlayerActivity" android:label="@string/app_name" android:configChanges="keyboardHidden|orientation"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".PlayListActivity"/> </application> </manifest> <!-- AndroidBuildingMusicPlayerActivity -->

12.最后的代码

下面是AndroidBuildingMusicPlayerActivity类的完整代码
AndroidBuildingMusicPlayerActivity.java
package com.androidhive.musicplayer; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Random; import android.app.Activity; import android.content.Intent; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.widget.ImageButton; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; publicclass 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 Player private MediaPlayer mp; // Handler to update UI timer, progress bar etc,. private Handler mHandler = new Handler();; private SongsManager songManager; private Utilities utils; privateint seekForwardTime = 5000 ; // 5000 milliseconds privateint seekBackwardTime = 5000 ; // 5000 milliseconds privateint currentSongIndex = 0 ; privateboolean isShuffle = false ; privateboolean isRepeat = false ; private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); @Override publicvoid onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.player); // All player buttons 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); // Mediaplayer mp = new MediaPlayer(); songManager = new SongsManager(); utils = new Utilities(); // Listeners songProgressBar.setOnSeekBarChangeListener( this ); // Important mp.setOnCompletionListener( this ); // Important // Getting all songs list songsList = songManager.getPlayList(); // By default play first song 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() { @Override publicvoid onClick(View arg0) { // check for already playing if (mp.isPlaying()){ if (mp!= null ){ mp.pause(); // Changing button image to play button btnPlay.setImageResource(R.drawable.btn_play); } } else { // Resume song if (mp!= null ){ mp.start(); // Changing button image to pause button btnPlay.setImageResource(R.drawable.btn_pause); } } } }); /** * Forward button click event * Forwards song specified seconds * */ btnForward.setOnClickListener( new View.OnClickListener() { @Override publicvoid onClick(View arg0) { // get current song position int currentPosition = mp.getCurrentPosition(); // check if seekForward time is lesser than song duration if (currentPosition + seekForwardTime <= mp.getDuration()){ // forward song mp.seekTo(currentPosition + seekForwardTime); } else { // forward to end position mp.seekTo(mp.getDuration()); } } }); /** * Backward button click event * Backward song to specified seconds * */ btnBackward.setOnClickListener( new View.OnClickListener() { @Override publicvoid onClick(View arg0) { // get current song position int currentPosition = mp.getCurrentPosition(); // check if seekBackward time is greater than 0 sec if (currentPosition - seekBackwardTime >= 0 ){ // forward song mp.seekTo(currentPosition - seekBackwardTime); } else { // backward to starting position mp.seekTo( 0 ); } } }); /** * Next button click event * Plays next song by taking currentSongIndex + 1 * */ btnNext.setOnClickListener( new View.OnClickListener() { @Override publicvoid onClick(View arg0) { // check if next song is there or not if (currentSongIndex < (songsList.size() - 1 )){ playSong(currentSongIndex + 1 ); currentSongIndex = currentSongIndex + 1 ; } else { // play first song playSong( 0 ); currentSongIndex = 0 ; } } }); /** * Back button click event * Plays previous song by currentSongIndex - 1 * */ btnPrevious.setOnClickListener( new View.OnClickListener() { @Override publicvoid onClick(View arg0) { if (currentSongIndex > 0 ){ playSong(currentSongIndex - 1 ); currentSongIndex = currentSongIndex - 1 ; } else { // play last song playSong(songsList.size() - 1 ); currentSongIndex = songsList.size() - 1 ; } } }); /** * Button Click event for Repeat button * Enables repeat flag to true * */ btnRepeat.setOnClickListener( new View.OnClickListener() { @Override publicvoid onClick(View arg0) { if (isRepeat){ isRepeat = false ; Toast.makeText(getApplicationContext(), "Repeat is OFF" , Toast.LENGTH_SHORT).show(); btnRepeat.setImageResource(R.drawable.btn_repeat); } else { // make repeat to true isRepeat = true ; Toast.makeText(getApplicationContext(), "Repeat is ON" , Toast.LENGTH_SHORT).show(); // make shuffle to false isShuffle = false ; btnRepeat.setImageResource(R.drawable.btn_repeat_focused); btnShuffle.setImageResource(R.drawable.btn_shuffle); } } }); /** * Button Click event for Shuffle button * Enables shuffle flag to true * */ btnShuffle.setOnClickListener( new View.OnClickListener() { @Override publicvoid onClick(View arg0) { if (isShuffle){ isShuffle = false ; Toast.makeText(getApplicationContext(), "Shuffle is OFF" , Toast.LENGTH_SHORT).show(); btnShuffle.setImageResource(R.drawable.btn_shuffle); } else { // make repeat to true isShuffle= true ; Toast.makeText(getApplicationContext(), "Shuffle is ON" , Toast.LENGTH_SHORT).show(); // make shuffle to false isRepeat = 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( new View.OnClickListener() { @Override publicvoid onClick(View arg0) { Intent i = new Intent(getApplicationContext(), PlayListActivity. class ); startActivityForResult(i, 100 ); } }); } /** * Receiving song index from playlist view * and play the song * */ @Override protectedvoid onActivityResult( int requestCode, int resultCode, Intent data) { super .onActivityResult(requestCode, resultCode, data); if (resultCode == 100 ){ currentSongIndex = data.getExtras().getInt( "songIndex" ); // play selected song playSong(currentSongIndex); } } /** * Function to play a song * @param songIndex - index of song * */ publicvoid playSong( int songIndex){ // Play song try { mp.reset(); mp.setDataSource(songsList.get(songIndex).get( "songPath" )); mp.prepare(); mp.start(); // Displaying Song title String songTitle = songsList.get(songIndex).get( "songTitle" ); songTitleLabel.setText(songTitle); // Changing Button Image to pause image btnPlay.setImageResource(R.drawable.btn_pause); // set Progress bar values songProgressBar.setProgress( 0 ); songProgressBar.setMax( 100 ); // Updating progress bar updateProgressBar(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * Update timer on seekbar * */ publicvoid updateProgressBar() { mHandler.postDelayed(mUpdateTimeTask, 100 ); } /** * Background Runnable thread * */ private Runnable mUpdateTimeTask = new Runnable() { publicvoid run() { long totalDuration = mp.getDuration(); long currentDuration = mp.getCurrentPosition(); // Displaying Total Duration time songTotalDurationLabel.setText( "" +utils.milliSecondsToTimer(totalDuration)); // Displaying time completed playing songCurrentDurationLabel.setText( "" +utils.milliSecondsToTimer(currentDuration)); // Updating progress bar int progress = ( int )(utils.getProgressPercentage(currentDuration, totalDuration)); //Log.d("Progress", ""+progress); songProgressBar.setProgress(progress); // Running this thread after 100 milliseconds mHandler.postDelayed( this , 100 ); } }; /** * * */ @Override publicvoid onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { } /** * When user starts moving the progress handler * */ @Override publicvoid onStartTrackingTouch(SeekBar seekBar) { // remove message Handler from updating progress bar mHandler.removeCallbacks(mUpdateTimeTask); } /** * When user stops moving the progress hanlder * */ @Override publicvoid onStopTrackingTouch(SeekBar seekBar) { mHandler.removeCallbacks(mUpdateTimeTask); int totalDuration = mp.getDuration(); int currentPosition = utils.progressToTimer(seekBar.getProgress(), totalDuration); // forward or backward to certain seconds mp.seekTo(currentPosition); // update timer progress again updateProgressBar(); } /** * On Song Playing completed * if repeat is ON play same song again * if shuffle is ON play random song * */ @Override publicvoid onCompletion(MediaPlayer arg0) { // check for repeat is ON or OFF if (isRepeat){ // repeat is on play same song again playSong(currentSongIndex); } else if (isShuffle){ // shuffle is on - play a random song Random rand = new Random(); currentSongIndex = rand.nextInt((songsList.size() - 1 ) - 0 + 1 ) + 0 ; playSong(currentSongIndex); } else { // no repeat or shuffle ON - play next song if (currentSongIndex < (songsList.size() - 1 )){ playSong(currentSongIndex + 1 ); currentSongIndex = currentSongIndex + 1 ; } else { // play first song playSong( 0 ); currentSongIndex = 0 ; } } } @Override publicvoid onDestroy(){ super .onDestroy(); mp.release(); } }

14.往模拟器SDCard里添加mp3文件(用于测试)

最后,我们需要往模拟器里面添加几首歌曲用来播放。 1.在用你的Android模拟器来测试这个程序,你需要加载 一些歌曲到你的模拟器。您可以使用adb工具,它往Android SDK模拟器SD卡发送文件。
导航到你的Android SDK文件夹/平台工具/使用命令行。和使用push命令,您可以发送文件到SD卡。 (开始你的模拟器执行推送命令之前)
platform-tools> adb push "c:\Songs\White Flag.mp3" "/sdcard/"


15.运行


运行我们的程序,效果如下: Android构建音频播放器教程(四)_第1张图片 Android构建音频播放器教程(四)_第2张图片dai 完整代码已经放在网盘里了,地址如下: http://115.com/file/dptieqtn#AndroidBuildingMusicPlayer.zip

更多相关文章

  1. AndroidManifest.xml文件详解(data)
  2. [1] Android主要源代码组成
  3. Android Studio 活动的启动模式 standard singleTop singleTask
  4. android 根据string 获取资源文件的id
  5. android 模拟器访问PC
  6. 安卓模拟器去掉头部标题
  7. Android 实例子源代码文件下载地址380个合集
  8. android 布局文件中xmlns:android="http://schemas.android.com/

随机推荐

  1. Android系统源码基础知识讲解
  2. Android消息提示框Toast
  3. Android进程与线程基本知识
  4. android的测试工具CTS
  5. android的测试工具CTS
  6. 从Android读取Unity assets下的图片并保
  7. Android(安卓)核心分析 之七------Servic
  8. Android获取存储设备挂载路径
  9. Android(安卓)AsyncTask
  10. Android里的shell的系统命令