*********背景音乐*******

来源:互联网 发布:健康体检软件系统 编辑:程序博客网 时间:2024/04/19 03:12

*********背景音乐*******

1.通过android,实现背景音乐效果

(1)项目简图如图所示:

(2)多线程实现后台播放背景音乐的主要代码如下:

package com.example.service;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;

public class AudioService extends Service implements
  MediaPlayer.OnCompletionListener {
 // 实例化MediaPlayer对象
 MediaPlayer player;
 private final IBinder binder = new AudioBinder();

 @Override
 public IBinder onBind(Intent intent) {
  return binder;
 }

 public void onCreate() {
  super.onCreate();
  // 从raw文件夹中获取一个应用自带的mp3文件
  player = MediaPlayer.create(this, R.raw.qq);
  player.setOnCompletionListener(this);
  player.setLooping(true);
 }

 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {
  super.onStartCommand(intent, flags, startId);
  if (!player.isPlaying()) {
   new MusicPlayThread().start();
  }
  else player.isPlaying();
  return START_STICKY;
 }

 
 /**
  * 当Audio播放完的时候触发该动作
  */
 public void onCompletion(MediaPlayer mp) {
  stopSelf();// 结束了,则结束Service

 }

 public void onDestroy() {
  super.onDestroy();
  if (player.isPlaying()) {
   player.stop();
  }
  player.release();
 }

 // 为了和Activity交互,我们需要定义一个Binder对象
 public class AudioBinder extends Binder {
  // 返回Service对象
  public AudioService getService() {
   return AudioService.this;
  }
 }

 private class MusicPlayThread extends Thread {
  public void run() {
   if (!player.isPlaying()) {
    player.start();
   }
  }
 }
  
}

实例AndroidManifest.xml文件配置Service

<applicationandroid:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name="com.example.musicproject.MainActivity"

android:label="@string/app_name" >

<intent-filter>

<actionandroid:name="android.intent.action.MAIN" />

<categoryandroid:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

<serviceandroid:name=".MusicService">

</service>

</application>

为了避免重复开启播放功能我在原来代码的基础上增加了单例模式

  1. import android.content.Context;  
  2. import android.content.res.AssetFileDescriptor;  
  3. import android.media.MediaPlayer;  
  4. import android.util.Log;  
  5.   
  6. /** 
  7.  *  
  8.  * This class is used for controlling background music 
  9.  *  
  10.  */  
  11. public class BackgroundMusic {  
  12.     private static BackgroundMusic backgroundMusic = null;  
  13.     private static final String TAG = "Bg_Music";  
  14.     private float mLeftVolume;  
  15.     private float mRightVolume;  
  16.     private Context mContext;  
  17.     private MediaPlayer mBackgroundMediaPlayer;  
  18.     private boolean mIsPaused;  
  19.     private String mCurrentPath;  
  20.   
  21.     private BackgroundMusic(Context context) {  
  22.         this.mContext = context;  
  23.         initData();  
  24.     }  
  25.   
  26.     public static BackgroundMusic getInstance(Context context) {  
  27.         if (backgroundMusic == null) {  
  28.             backgroundMusic = new BackgroundMusic(context);  
  29.         }  
  30.         return backgroundMusic;  
  31.     }  
  32.   
  33.     // 初始化一些数据  
  34.     private void initData() {  
  35.         mLeftVolume = 0.5f;  
  36.         mRightVolume = 0.5f;  
  37.         mBackgroundMediaPlayer = null;  
  38.         mIsPaused = false;  
  39.         mCurrentPath = null;  
  40.     }  
  41.   
  42.     /** 
  43.      * 根据path路径播放背景音乐 
  44.      *  
  45.      * @param path 
  46.      *            :assets中的音频路径 
  47.      * @param isLoop 
  48.      *            :是否循环播放 
  49.      */  
  50.     public void playBackgroundMusic(String path, boolean isLoop) {  
  51.         if (mCurrentPath == null) {  
  52.             // 这是第一次播放背景音乐--- it is the first time to play background music  
  53.             // 或者是执行end()方法后,重新被叫---or end() was called  
  54.             mBackgroundMediaPlayer = createMediaplayerFromAssets(path);  
  55.             mCurrentPath = path;  
  56.         } else {  
  57.             if (!mCurrentPath.equals(path)) {  
  58.                 // 播放一个新的背景音乐--- play new background music  
  59.                 // 释放旧的资源并生成一个新的----release old resource and create a new one  
  60.                 if (mBackgroundMediaPlayer != null) {  
  61.                     mBackgroundMediaPlayer.release();  
  62.                 }  
  63.                 mBackgroundMediaPlayer = createMediaplayerFromAssets(path);  
  64.                 // 记录这个路径---record the path  
  65.                 mCurrentPath = path;  
  66.             }  
  67.         }  
  68.   
  69.         if (mBackgroundMediaPlayer == null) {  
  70.             Log.e(TAG, "playBackgroundMusic: background media player is null");  
  71.         } else {  
  72.             // 若果音乐正在播放或已近中断,停止它---if the music is playing or paused, stop it  
  73.             mBackgroundMediaPlayer.stop();  
  74.             mBackgroundMediaPlayer.setLooping(isLoop);  
  75.             try {  
  76.                 mBackgroundMediaPlayer.prepare();  
  77.                 mBackgroundMediaPlayer.seekTo(0);  
  78.                 mBackgroundMediaPlayer.start();  
  79.                 this.mIsPaused = false;  
  80.             } catch (Exception e) {  
  81.                 Log.e(TAG, "playBackgroundMusic: error state");  
  82.             }  
  83.         }  
  84.     }  
  85.   
  86.     /** 
  87.      * 停止播放背景音乐 
  88.      */  
  89.     public void stopBackgroundMusic() {  
  90.         if (mBackgroundMediaPlayer != null) {  
  91.             mBackgroundMediaPlayer.stop();  
  92.             // should set the state, if not , the following sequence will be  
  93.             // error  
  94.             // play -> pause -> stop -> resume  
  95.             this.mIsPaused = false;  
  96.         }  
  97.     }  
  98.   
  99.     /** 
  100.      * 暂停播放背景音乐 
  101.      */  
  102.     public void pauseBackgroundMusic() {  
  103.         if (mBackgroundMediaPlayer != null  
  104.                 && mBackgroundMediaPlayer.isPlaying()) {  
  105.             mBackgroundMediaPlayer.pause();  
  106.             this.mIsPaused = true;  
  107.         }  
  108.     }  
  109.   
  110.     /** 
  111.      * 继续播放背景音乐 
  112.      */  
  113.     public void resumeBackgroundMusic() {  
  114.         if (mBackgroundMediaPlayer != null && this.mIsPaused) {  
  115.             mBackgroundMediaPlayer.start();  
  116.             this.mIsPaused = false;  
  117.         }  
  118.     }  
  119.   
  120.     /** 
  121.      * 重新播放背景音乐 
  122.      */  
  123.     public void rewindBackgroundMusic() {  
  124.         if (mBackgroundMediaPlayer != null) {  
  125.             mBackgroundMediaPlayer.stop();  
  126.             try {  
  127.                 mBackgroundMediaPlayer.prepare();  
  128.                 mBackgroundMediaPlayer.seekTo(0);  
  129.                 mBackgroundMediaPlayer.start();  
  130.                 this.mIsPaused = false;  
  131.             } catch (Exception e) {  
  132.                 Log.e(TAG, "rewindBackgroundMusic: error state");  
  133.             }  
  134.         }  
  135.     }  
  136.   
  137.     /** 
  138.      * 判断背景音乐是否正在播放 
  139.      *  
  140.      * @return:返回的boolean值代表是否正在播放 
  141.      */  
  142.     public boolean isBackgroundMusicPlaying() {  
  143.         boolean ret = false;  
  144.         if (mBackgroundMediaPlayer == null) {  
  145.             ret = false;  
  146.         } else {  
  147.             ret = mBackgroundMediaPlayer.isPlaying();  
  148.         }  
  149.         return ret;  
  150.     }  
  151.   
  152.     /** 
  153.      * 结束背景音乐,并释放资源 
  154.      */  
  155.     public void end() {  
  156.         if (mBackgroundMediaPlayer != null) {  
  157.             mBackgroundMediaPlayer.release();  
  158.         }  
  159.         // 重新“初始化数据”  
  160.         initData();  
  161.     }  
  162.   
  163.     /** 
  164.      * 得到背景音乐的“音量” 
  165.      *  
  166.      * @return 
  167.      */  
  168.     public float getBackgroundVolume() {  
  169.         if (this.mBackgroundMediaPlayer != null) {  
  170.             return (this.mLeftVolume + this.mRightVolume) / 2;  
  171.         } else {  
  172.             return 0.0f;  
  173.         }  
  174.     }  
  175.   
  176.     /** 
  177.      * 设置背景音乐的音量 
  178.      *  
  179.      * @param volume 
  180.      *            :设置播放的音量,float类型 
  181.      */  
  182.     public void setBackgroundVolume(float volume) {  
  183.         this.mLeftVolume = this.mRightVolume = volume;  
  184.         if (this.mBackgroundMediaPlayer != null) {  
  185.             this.mBackgroundMediaPlayer.setVolume(this.mLeftVolume,  
  186.                     this.mRightVolume);  
  187.         }  
  188.     }  
  189.   
  190.     /** 
  191.      * create mediaplayer for music 
  192.      *  
  193.      * @param path 
  194.      *            the path relative to assets 
  195.      * @return 
  196.      */  
  197.     private MediaPlayer createMediaplayerFromAssets(String path) {  
  198.         MediaPlayer mediaPlayer = null;  
  199.         try {  
  200.             AssetFileDescriptor assetFileDescritor = mContext.getAssets()  
  201.                     .openFd(path);  
  202.             mediaPlayer = new MediaPlayer();  
  203.             mediaPlayer.setDataSource(assetFileDescritor.getFileDescriptor(),  
  204.                     assetFileDescritor.getStartOffset(),  
  205.                     assetFileDescritor.getLength());  
  206.             mediaPlayer.prepare();  
  207.             mediaPlayer.setVolume(mLeftVolume, mRightVolume);  
  208.         } catch (Exception e) {  
  209.             mediaPlayer = null;  
  210.             Log.e(TAG, "error: " + e.getMessage(), e);  
  211.         }  
  212.         return mediaPlayer;  
  213.     }  


 

 

0 0
原创粉丝点击