- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用这个标准的 SoundManager。它在我所有的设备上都能正常工作,但只是偶尔在市场上出现这些错误
SoundManager.playSound(SoundManager.java:87) 中的 NullPointerException
SoundManager.cleanup(SoundManager.java:107) 中的 NullPointerException
代码如下:
public class SoundManager {
private static SoundManager _instance;
private static SoundPool mSoundPool;
private static HashMap<Integer, Integer> mSoundPoolMap;
private static AudioManager mAudioManager;
private static Context mContext;
private SoundManager(){ }
static synchronized public SoundManager getInstance(){
if (_instance == null)
_instance = new SoundManager();
return _instance;
}
public static void initSounds(Context theContext){
mContext = theContext;
mSoundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);
mSoundPoolMap = new HashMap<Integer, Integer>();
mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
}
public static void addSound(int Index,int SoundID){
mSoundPoolMap.put(Index, mSoundPool.load(mContext, SoundID, 1));
}
public static void loadSounds(){
mSoundPoolMap.put(1, mSoundPool.load(mContext, R.raw.kick1, 1));
mSoundPoolMap.put(2, mSoundPool.load(mContext, R.raw.kick2, 1));
mSoundPoolMap.put(3, mSoundPool.load(mContext, R.raw.kick3, 1));
}
public static void playSound(int index, float volume){
**line 87:** float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mSoundPool.play(mSoundPoolMap.get(index), streamVolume*volume, streamVolume*volume, 1, 0, 1);
}
public static void stopSound(int index){
mSoundPool.stop(mSoundPoolMap.get(index));
}
public static void cleanup(){
**line 107:** mSoundPool.release();
mSoundPool = null;
mSoundPoolMap.clear();
mAudioManager.unloadSoundEffects();
_instance = null;
}
}
这是启动 Activity 中的清理调用:
//REMOVE SOUND MEMORY ALLOCATION
@Override
public void onDestroy()
{
super.onDestroy();
SoundManager.cleanup();
}
有谁知道是什么原因导致这些偶尔出现的罕见错误以及如何预防这些错误?这发生在我所有使用此 SoundManager 的应用程序中......即使是有点奇怪的猜测也会有所帮助。
最佳答案
当您初始化 SoundManager 时,请使用 Application Context。您可能在 Activity 之间移动时遇到问题。如果 SoundManager 比您的 Activity 生命周期更长。您甚至可以在您的应用程序中进行初始化。
public class MyAndroidApp extends Application {
@Override
public void onCreate() {
super.onCreate();
SoundManager.initSounds(this);
}
}
我也同意 WarrenFaith 的观点。唯一的静态变量应该是 _instance 和 getInstance()。
此外,如果您在 Application 类中加载声音,则无需担心同步问题。
如果对您有帮助,您可以查看我使用的代码。它利用来自 http://code.google.com/p/opensl-soundpool/ 的 OpenSL SoundPool 库
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
import java.util.concurrent.atomic.AtomicBoolean;
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import com.kytomaki.openslsoundpool.JavaSoundPool;
import com.kytomaki.openslsoundpool.OpenSLSoundPool;
import com.kytomaki.openslsoundpool.SoundPoolIf;
final public class SoundManager
{
// Predetermined sound ID's
public static final int NO_SOUND = -1 ;
public static final int WINNER = -2 ;
// Tag for logging
protected static final String TAG = "SoundManager" ;
/** Used to load and play sounds **/
private Context context ;
/** Sound can be disable from separate thread **/
private final AtomicBoolean useSound ;
// Sound Arrays
private final ArrayList<Integer> winningSounds ;
private final SoundPoolIf soundPool ;
private final HashMap<Integer, Integer> soundPoolMap ;
private final AudioManager audioManager ;
/** Singleton object for sound play back **/
private static SoundManager soundManagerInstance ;
private static final int USE_SOUNDPOOL = 1 ;
private static final int USE_OPENSL = 2 ;
private static int use = USE_SOUNDPOOL ;
/**
* Private Method to create a new SoundManager<br>
* This is a Singleton Object
* @param context Should be the Application Context
*/
private SoundManager( final Context context )
{
setContext( context ) ;
useSound = new AtomicBoolean( true ) ;
audioManager = (AudioManager) context.getSystemService( Context.AUDIO_SERVICE ) ;
soundPoolMap = new HashMap<Integer, Integer>() ;
winningSounds = new ArrayList<Integer>() ;
if ( use == USE_OPENSL )
{
soundPool = new OpenSLSoundPool( 2, OpenSLSoundPool.RATE_44_1, OpenSLSoundPool.FORMAT_16, 1) ;
} else {
soundPool = new JavaSoundPool( 2 ) ;
}
}
/**
* Must be called before using<br>
* Best to initialize in Application Class
* @param context
*/
public static void initSoundManager( final Context context )
{
if ( soundManagerInstance == null )
{
soundManagerInstance = new SoundManager( context ) ;
}
else
{
throw new UnsupportedOperationException( "Sound manager has already been created" ) ;
}
}
/**
* Overloaded method to allow use of OpenSL
* @param context
* @param useOpenSL
*/
public static void initSoundManager( final Context context, final boolean useOpenSL){
if(useOpenSL){
use = USE_OPENSL;
}
initSoundManager(context);
}
/**
* Must initialize first with {@link SoundManager#initSoundManager(Context)}
* @return instance of SoundManager
*/
public static SoundManager getSoundManagerInstance()
{
if ( soundManagerInstance != null )
{
return soundManagerInstance ;
}
else
{
throw new UnsupportedOperationException( "SoundManager must be initalized" ) ;
}
}
/**
* Add a sound from an android resource file R.id.sound<br>
* To be played back with SoundManager.play(soundId)
* @param soundId
* @param soundResourceId
*/
public void addSound( final int soundId, final int soundResourceId )
{
soundPoolMap.put(soundId, soundPool.load(getContext(), soundResourceId));
}
/**
* Adds a winning sound from a resource to be played at random<br>
* Called by SoundManager.play(WINNER)
* @param soundResourceId
*/
public void addWinningSound( final int soundResourceId )
{
winningSounds.add( soundResourceId ) ;
}
/**
* Plays a sound first checking if sound is enabled
* @param soundToPlay soundId or WINNER to play random winning sound
*/
public synchronized void play( final int soundToPlay )
{
if ( isUseSound() )
{
switch ( soundToPlay )
{
case NO_SOUND :
break ;
case WINNER :
// Play a random winning sound using media player
final MediaPlayer mp ;
mp = MediaPlayer.create( getContext(), randomWinnerSound() ) ;
if ( mp != null )
{
mp.seekTo( 0 ) ;
mp.start() ;
}
break ;
default :
playSound( soundToPlay ) ;
break ;
}
}
}
/**
* Calls soundpool.play
* @param soundToPlay
*/
private void playSound( final int soundToPlay )
{
float streamVolume = audioManager.getStreamVolume( AudioManager.STREAM_MUSIC ) ;
streamVolume = streamVolume / audioManager.getStreamMaxVolume( AudioManager.STREAM_MUSIC ) ;
soundPool.play(soundPoolMap.get(soundToPlay), streamVolume);
}
/**
* @return random winning sound position
*/
private int randomWinnerSound()
{
final Random rand = new Random() ;
final int playNumber = rand.nextInt( winningSounds.size() ) ;
return winningSounds.get( playNumber ) ;
}
/**
* @param context the context to set
*/
private final void setContext( final Context context )
{
this.context = context ;
}
/**
* @return the context
*/
private final Context getContext()
{
return context ;
}
/**
* @param useSound false to disable sound
*/
public final void setUseSound( final boolean useSound )
{
this.useSound.set( useSound ) ;
}
/**
* @return the useSound
*/
public boolean isUseSound()
{
return useSound.get() ;
}
}
仍在进行中,但已完成工作。
关于android - SoundManager 中偶尔出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11917595/
我正在使用Amazing Audio Player在我的网站上播放音乐。该工具只是自定义本地html5音频。但是我在html的上遇到一些问题。特别是当我的脚本调用load()函数时。 在Google
我使用简单的SoundManager播放来自sounpool的声音。我的问题是,即使我使用mySound.release();,退出应用程序时声音也不会停止播放。 否则,一切都会正常进行,这是我的代码
function doclick(){ soundManager.createSound({ id: 'mySound', url: 'http://loca
我想在 Canvas 上为音频创建音频可视化,并决定使用 SoundManager2。问题是应该返回波形数据的函数会抛出空数组。知道该怎么办吗? (我听到声音在播放,所以它加载正确:))
好吧,这东西太棒了!我在 .js 文件中设置了 SoundManager 2,并在我的页面上播放音频。我目前唯一的问题是弄清楚如何在 soundManager.setup({...}) 之外播放音频。
我正在尝试安装 SoundManager 的 360Ui播放器。 但我似乎无法钉牢它。 这是我的标题中的 jQuery 代码: ... //some soundmanager set
我使用这个标准的 SoundManager。它在我所有的设备上都能正常工作,但只是偶尔在市场上出现这些错误 SoundManager.playSound(SoundManager.java:87) 中
如果我播放一个声音,它运行良好。 添加第二个声音会导致它崩溃。 有人知道是什么导致了这个问题吗? private SoundManager mSoundManager; /** Called when
以下代码适用于我的桌面浏览器,但不适用于我 iPhone 上的 Safari,它会显示 alert() 但不会播放音频。我究竟做错了什么? soundManager.url = '/assets/ba
所以我有这个应用程序,每次循环播放声音时我都需要淡入淡出效果,以便过渡流畅。 我正在使用 SoundManager 2。 更新代码: $(document).ready(function () {
我想在声音管理器waveformData提供的 Canvas 数据上实时绘制,并使其看起来像一条平滑移动的均衡器线,如 http://paperjs.org/tutorials/animation/c
我需要使用此脚本将声音预加载到我的网站: soundManager.setup({ url: '/swf/', flashVersion:9, useFlashBlock:f
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
我构建了一个应用程序,它既可以播放上传的原始 mp3 文件,也可以播放使用 FFMPEG 转换的副本。我发现在某些情况下,FFMPEG 文件在启动时会在瞬间发出可怕的爆裂声/咔嗒声/尖叫声(请听下文)
我只是尝试使用 GWT-SoundManager2 来发出一些噪音。我刚刚尝试了一个简单的代码,如下所示: SoundManager sm; String SS = "soundId" sm = So
我正在为手机开发一款 HTML5 游戏。声音有时起作用,有时消失。您是否对手机没有闪光灯的 SoundManager 2 这样的库有任何想法? 最佳答案 要将 HTML5 与 SoundManager
我正在使用 wpaudio 插件将 mp3 链接转换为 javascript/flash 音频播放器。我的问题是我在我网站的两个区域使用这个插件:一个在黑色背景上,一个在白色背景上。我需要为每个页面使
我正在尝试为一个简单的游戏创建一个声音管理器,我知道这对于这个应用程序来说不是必需的,而是为了我这样做的学习体验。我尝试了几种不同的方法,但尚未取得真正的成功。以下是我目前的尝试。我相信我的主要问题是
我正在尝试使用 SoundManager2 播放多个音频文件到目前为止,这是我能找到的关于该站点的唯一可用示例。 soundManager.setup({ url: '/path/to/swf
所以我在使用 soundcloud api 和 html 5 音频播放器时遇到了一些问题。 主要目标是仅使用 html5 访问所有公开可用的 soundcloud 曲调。 我正在使用以下内容。
我是一名优秀的程序员,十分优秀!