之前做了关于视频通话的应用,有一块功能是铃声的播放,遇到了一些坑。

这里封装了一个工具类,代码如下:

import android.content.Context;

import android.media.AudioManager;

import android.media.SoundPool;

import android.util.Log;

import java.util.HashMap;

public class MediaSoundUtil {

private static final int KEY_RING = 1;

private static final int KEY_REJECT = 2;

private static final String TAG = MediaSoundUtil.class.getSimpleName();

private static volatile MediaSoundUtil sSoundPoolUtil;

private final Context mContext;

private final SoundPool mSoundPool;

private final HashMap mSoundMap;

private int mCurrentId;

//声音资源加载完成的标识位

private boolean mHasLoaded;

private MediaSoundUtil(Context context) {

mContext = context.getApplicationContext();

mSoundPool = new SoundPool(2, AudioManager.STREAM_VOICE_CALL,0);

mSoundMap = new HashMap<>();

mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {

@Override

public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {

Log.i(TAG,"onLoadComplete "+sampleId+"staus "+status);

mHasLoaded = true;

}

});

mSoundMap.put(KEY_RING,mSoundPool.load(mContext, R.raw.ring,1));

mSoundMap.put(KEY_REJECT,mSoundPool.load(mContext,R.raw.reject,1));

Log.i(TAG,"MediaSoundUtil init map = "+mSoundMap);

}

public static MediaSoundUtil getInstance(Context context) {

if (sSoundPoolUtil == null) {

synchronized (MediaSoundUtil.class) {

if (sSoundPoolUtil == null) {

sSoundPoolUtil = new MediaSoundUtil(context);

}

}

}

return sSoundPoolUtil;

}

public void playRingSound() {

stopPlay();

Log.i(TAG, "playRingSound " + mCurrentId+",hasload "+mHasLoaded);

if (!mHasLoaded) {

mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {

@Override

public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {

if (sampleId == mSoundMap.get(KEY_RING)) {

playSoundId(mSoundMap.get(KEY_RING), true);

}

Log.i(TAG, "playRingSound onLoadComplete " + sampleId + "staus " + status);

mHasLoaded = true;

}

});

} else {

playSoundId(mSoundMap.get(KEY_RING), true);

}

}

public void playRejectSound(){

stopPlay();

Log.i(TAG,"playRejectSound "+mCurrentId+",hasload "+mHasLoaded);

if(!mHasLoaded){

mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {

@Override

public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {

if (sampleId == mSoundMap.get(KEY_REJECT)) {

playSoundId(mSoundMap.get(KEY_REJECT), false);

}

Log.i(TAG, "playRejectSound onLoadComplete " + sampleId + "staus " + status);

mHasLoaded = true;

}

});

}else{

playSoundId(mSoundMap.get(KEY_REJECT),false);

}

}

public void stopPlay() {

Log.i(TAG,"stopPlay "+mCurrentId);

if (mCurrentId != 0) {

mSoundPool.stop(mCurrentId);

}

}

private int playSoundId(int sampleId,boolean isLoop) {

mCurrentId = mSoundPool.play(sampleId, 1f, 1f, 1, isLoop ? -1 : 0, 1);

Log.i(TAG,"playSoundId = "+mCurrentId);

return mCurrentId;

}

}

android p官方铃声,Android 铃声播放相关推荐

  1. android mvvm官方demo,Android MVVM实战Demo完全解析

    最新 [重大更新说明] 感谢各位读者的阅读,这篇文章由于年代久远,存在一些错误的观点,再次向大家道歉,也做一个技术上的解释说明. 受限于当时的技术水平和网络论调,在那个时代,网上绝大多数人 都认为加了 ...

  2. android studio 官方虚拟机,Android Studio安装虚拟机步骤

    1. 新建 或者 2. 按图中的步骤,选择一款设备,建议选择分辨率小的,不占内存 3. 按图 4. 按图 5. 点击finish后,选择之前下载的虚拟机,点next 6. 虚拟机重命名 7. 到这里, ...

  3. android pie 官方壁纸,Android 10.0 内置壁纸提取,带你提前进入Q时代

    原标题:Android 10.0 内置壁纸提取,带你提前进入Q时代 3月14日早晨谷歌推出了期待已久的Android Q的首个测试版本,这是Android系统推出以来的第十个大版本.在这个手机行业经过 ...

  4. Android开发音效增强中铃声播放Ringtone及声音池调度SoundPool的讲解及实战(超详细 附源码)

    需要源码请点赞关注收藏后评论区留下QQ~~~ 一.铃声播放 虽然媒体播放器MediaPlayer既可用来播放视频,也可以用来播放音频,但是在具体的使用场合,MediaPlayer存在某些播音方面的不足 ...

  5. Android5.0自定义闹钟,Android自定义View 实现闹钟唤起播放闹钟铃声功能

    先上图看一下闹钟唤期页面的效果 实现的功能: 1:转动的图片根据天气情况更换 2:转动时间可以设置,转动结束,闹铃声音就结束 3:光圈颜色渐变效果 直接上代码啦: package com.yuekon ...

  6. android java 怎么更换默认铃声,Android如何通过长按按钮将声音设置为铃声

    如何长按按钮将声音设置为铃声? 目前它只适用于sound4但不适用于sound5 包com.test.soundboard; import java.io.File; import java.io.F ...

  7. Android应用--简、美音乐播放器原型放送(作者:小巫)

    Android应用--简.美音乐播放器原型放送 2013年7月5日简.美音乐播放器开发 前言:小巫的简.美音乐播放器从5月7号开始开发,之前以为时间很充足,也没有估量整个软件的需求,如果简单实现基本的 ...

  8. android静音模式,android静音模式下仍可以播放媒体声音以及调节其大小。。。。...

    不多说,先上图,先看一张我开发板的截图  ... 首先我先解释一下: 由于我的开发板硬件没有调节声音的按键,因而只能在图中所示 处调节,但是在静音之后,那个声音调节又不可点击,所以我们要在静音模式下使 ...

  9. android 自定义推流器,Android直播实现 Android端推流、播放

    最近想实现一个Android直播,但是对于这方面的资料都比较零碎,一开始是打算用ffmpeg来实现编码推流,在搜集资料期间,找到了几个强大的开源库,直接避免了jni的代码,集成后只用少量的java代码 ...

最新文章

  1. 转贴一篇很不错的有关ASP.NET Session的分析文章
  2. 5G 与边缘计算的发展现状(2021 年 6 月)
  3. 第二次讲课内容(函数和快速幂)
  4. 串灯控制盒去掉怎么接_单双向可控硅好坏怎么判断
  5. 论如何入门地使用vscode
  6. 滴水穿石--mysql添加授权用户命令
  7. 辐流式重力浓缩池计算_注册考试重点!平流式、竖流式、辐流式、斜板式4大沉淀池构型...
  8. #动态规划 LeetCode 120 三角形最小路径和
  9. JQuery中Ajax传json格式中文至后台乱码
  10. 将Linkedin连结到outlook中
  11. Web 应用程序渗透测试清单
  12. 杰理之低延时无线麦功能支持以下两种组合配置【篇】
  13. Linux查询IP失败
  14. 数学建模竞赛论文写作规范
  15. 基于php047园林植物检索系统网站
  16. 回顾2021,展望2022,静Yu的万粉成长之路
  17. Learned-Mixin +H(LMH)
  18. html什么是插件,什么是jquery插件?
  19. 常见的百度蜘蛛IP 日志分析
  20. 群晖域名解析出现错误?别慌,排查原因有步骤

热门文章

  1. JavaScript使用技巧(2)
  2. java jui 正则表达式_正则表达式-Gorilla City-51CTO博客
  3. Javascript第五章删除、克隆、插入、替换方法源码第九课
  4. js node 打包mac应用_node app 打包工具pkg的具体使用
  5. 鸿蒙系统非手机用,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  6. idea怎么给方法快速添加注释_生完孩子胸部下垂怎么办?来看快速矫正的方法
  7. 2016级算法第五次上机-C.Bamboo和Coco
  8. ASP.NET Web API 入门 (API接口、寄宿方式、HttpClient调用)
  9. iOS 上的相机捕捉 swift
  10. 【每日一linux命令4】常用参数: