android软件提示音一般使用的是SoundPool以及MediaPlayer方式进行提示。下面是自己在开放中使用到的一个提示音工具类,可根据自己需要进行选择提示音播放方式(如有不对之处还请指教)。下面上代码(工具类可直接复制,不依赖于任何环境,工具类可在(Android提示音工具类)下载,密码:34di。
1.记得在AndroidManifest.xml中配置权限:
<!-- 调用系统震动 -->
<uses-permission android:name="android.permission.VIBRATE">
<!-- 允许程序写入外部存储 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS">
</uses-permission></uses-permission>
2.下面是java代码:
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.SoundPool;
import android.os.Vibrator;
import android.content.SharedPreferences;
/**
* 声音配置工具类
* (1)soundPool适合播放一些小音乐,文件最大不超过1M.
* (2)MediaPlayer耗用比较大,一般操作大的文件.
* @author yzy
*
*/
public class SoundConfigUtils implements OnBufferingUpdateListener,OnPreparedListener{
private static SoundConfigUtils soundConfigUtils;//单例化
private Context context;
public static final String SOUND_SHARE = "sound_share";
SharedPreferences sharedPreferUtil=null;//保存声音设置的share
public static SoundConfigUtils getInstance(Context context){
if(soundConfigUtils==null){
soundConfigUtils=new SoundConfigUtils(context);
}
return soundConfigUtils;
}
private SoundConfigUtils(Context context) {
super();
this.context = context;
sharedPreferUtil=context.getSharedPreferences(SOUND_SHARE ,Context.MODE_PRIVATE);
}
//播放声音的类型,可通过此枚举来控制不同的声音
public enum MusicType{
NEW_VISTOR,NEW_MSG
}
/**
* 播放声音
*/
@SuppressWarnings("deprecation")
public void startSound(final MusicType musicType){
boolean musicFlag=sharedPreferUtil.getBoolean(Contants.MUSIC_FLAG, true);//是否播放音乐
AudioManager audioManager=(AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
//系统声音管理类
Vibrator vibrator=(Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); //震动服务
long[] pattern={100,400,100,400}; //震动的频率,100表示等待时间,400表示震动时间
//(1)vibrator.vibrate(pattern,-1); 表示不重复,只震动一个循环;vibrator.vibrate(pattern,0);表示持续震动
//(2)vibrator.vibrate(pattern,1),表示从下标为1的开始重复震动 ;
//(3)vibrator.vibrate(1000),表示震动多少秒
switch (audioManager.getRingerMode()) { //获取系统设置模式
//静音
case AudioManager.RINGER_MODE_SILENT:
break;
//常规模式 两种情况:1.响铃不震动 2.响铃+震动
case AudioManager.RINGER_MODE_NORMAL:
int flag=0; //类型标志 0 响铃以及震动 1响铃但是不震动 2.只在静音模式下震动
//判断系统设置的震动类型
if(audioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER)==
AudioManager.VIBRATE_SETTING_OFF){ //不震动
flag=1;
}else if(audioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER)AudioManager.VIBRATE_SETTING_ONLY_SILENT){//只在静音时,震动
flag=2;
}else{ //震动
flag=0;
}
if(musicFlag){ //允许音乐的话
new Thread(){
@Override
public void run() {
//soundPool播放
initSoundPool();
try {
Thread.sleep(1000); //线程休眠1秒,为系统加载音乐资源文件
} catch (InterruptedException e) {
e.printStackTrace();
}
playSound(musicType.ordinal(), 0);//播放音乐
//MediaPlayer播放
// playMediaPlayer(1);
//playUrlMediaPlayer("http://sc1.111ttt.com/2016/5/01/14/194141533184.mp3");
}
}.start();
}
if(flag==0){
vibrator.vibrate(pattern,-1); //震动一次
}
break;
//震动
case AudioManager.RINGER_MODE_VIBRATE:
vibrator.vibrate(pattern,-1); //震动一次
break;
default:
break;
}
}
/**
* soundPool提示音效
* (1)初始化播放音频的组件
* (2)初始化播放音效列表(HashMap=(ID,Sp.load(...))
* (3)获取系统声音设置(设置左右音道)
* (4)play
*/
private SoundPool sp;
private Map<integer integer=""> sources=null;
private int streamId=0;
/**
* 初始化音频
*/
@SuppressLint("UseSparseArrays") private void initSoundPool(){
sp=new SoundPool(5, AudioManager.STREAM_MUSIC, 100); //(最多同时播放的音乐,音频的类型,品质)
sources=new HashMap<integer integer="">();
//sources.put(0, sp.load(context, R.raw.tip_01, 1));
//sp.load(上下文,资源,优先级); 加载资源需要充足的时间,可使线程休眠,加载铃声
//sources.put(1, sp.load(context, R.raw.tip_02, 1)); //sp.load(上下文,资源,优先级);
try {
sources.put(0, sp.load(context.getAssets().openFd("music/enter.mp3"),1));
sources.put(1, sp.load(context.getAssets().openFd("music/msg.mp3"),1));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 播放音效
* @param id
* @param loop
*/
private void playSound(int id,int loop){
AudioManager audioManager=(AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
//系统声音管理类
float currentSound=audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
//当前音量
//加载资源id(sp.load(...)的返回值,0表示加载失败)
//左声道,右声道,优先级,循环次数(0,播放一次,-1无限次,其他播放loop+1)
//播放速率(0.5f-2.0f,1.0f表示正常,2.0f表示两倍速率)
//返回值为streamId可作为之后的pause,stop的参数
}
/**
* 关闭声音
*/
public void stopSound(){
if(sp!=null){
if(streamId!=0){
sp.stop(streamId);
}
}
}
/**
* mediaplay提示音效
* 常用方法:
* reset():相当于重新实例化reset
* start(),pasue(),stop()
* prepare():缓冲
* isPlaying():是否在播放
* seekTo(position):从指定的位置开始播放
* release():销毁
* setDataSource(file,startOffset,length)|(string):设置media的音乐源
*/
private MediaPlayer mediaPlayer;
/**
* 播放mediaplayer
* playTypeId 播放media不同的方式
*/
private void playMediaPlayer(int playTypeId){
switch (playTypeId) {
//直接读取raw中的文件
case 0:{
//mediaPlayer=MediaPlayer.create(context, R.raw.tip_02);
//mediaPlayer.start();
break;
}
//读取Assert中的音乐文件 1.初始化AssetFileDescriptor 2.设置setDataSource 3.缓冲 4.开始播放
case 1:{
try {
AssetFileDescriptor assetFileDescriptor=context.getAssets().openFd("music/tip_03.mp3");
mediaPlayer=new MediaPlayer();
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(),
assetFileDescriptor.getStartOffset(),
assetFileDescriptor.getLength()); //设置播放源(数据源,开始点,总长度)
mediaPlayer.prepare(); //缓冲
} catch (IOException e) {
e.printStackTrace();
}
break;
}
//播放手机目录中的音乐
case 2:{
try {
mediaPlayer=new MediaPlayer();
mediaPlayer.setDataSource(""); //可以直接设置数据源的目录,此目录为手机上的目录
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
}
default:
break;
}
// mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
// @Override
// public void onCompletion(MediaPlayer mp) {
//
// mp.stop();
// }
// });
}
/**
* 停止播放
*/
private void stopMediaPlayer(){
if(mediaPlayer!=null){
if(mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
mediaPlayer.release();
mediaPlayer=null;
}
}
/**
* 播放网络音乐
*/
public void playUrlMediaPlayer(String mediaUrl){
mediaPlayer=new MediaPlayer();
try {
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setDataSource(mediaUrl);
mediaPlayer.prepare();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 播放进度
*/
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
//TODO: 可处理播放过程中要做的时
}
/**
* 缓冲完执行的代码
*/
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
}
</integer></integer>