2011-10-26 55 views
5

在本文档中,它是说:setStreamMute从未取消静音

静音指令是对客户端进程死亡保护:如果对流活动静音请求一个进程死亡,这个流将自动静音。

给定流的静音请求是累积的:AudioManager可以接收来自一个或多个客户端的多个静音请求,并且只有在接收到相同数量的取消静音请求时,流才会取消静音。

那么,第一段是真的;每当我的流程死亡时,我静音的所有流都会自动取消静音。 但是,无论我打电话多少次setStreamMute(someStream, false)它永远不会取消静音。 我最后一次尝试将它调用超过100万次后,只有一次静音,没有任何事情发生!

只要提及 - 如果我用相同的方法取消静音,则将其静音 - 保持静音。但在接下来的调用相同的方法 - 它永远不会取消静音。

我在Broadcast Receiver onReceive方法中静音,我开始使用闹钟管理器。所以也许是因为我的应用程序在屏蔽呼叫和非屏蔽呼叫之间的时间内被杀害了? (但我的应用程序仍然在RAM保持)

这个问题可能是因为我没有保持一个参考AlarmManager(每次获得不同的实例?)

有没有人遇到这样的问题?

回答

21

Apperantly,有在这些Android版本的bug;测试版本2.2和2.3.3,并存在错误。 的样子,如果你调用setStreamMute一个AudioManager对象:

AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 
am.setStreamMute(...., true); 

,你失去您参考,然后得到一个参考:

am = null; 
am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 

无论如何多次你现在打电话am.setStreamMute(..., false),它会从不 unmutes。

我觉得生病报告这个错误现在..

课:保持静态参考您的AudioManager。

@Michell Bak,感谢给我这个想法,检查它是否是Android软件的bug :)我一直被困在这个东西上太多时间了,我从来没有想过看看它不是我的故障。

+0

我正在使用Android 4.0版本和同样的问题在这里,看看http://stackoverflow.com/questions/14899395/how-to-mute-and-unmute-it-on-the-onpause- and-onresume –

+0

保留对'AudioManager'的相同实例的引用(最好是作为您的活动类的成员) – Jong

1

我从来没有使用过这个API,但一个快速的谷歌搜索,返回了一些结果,它不工作。这似乎是仍然存在的是Android 2.3的一个错误:

http://code.google.com/p/android/issues/detail?id=4235

+0

我的项目是在Android 2.2 – Jong

+0

但这个问题是它没有静音,没有失败取消静音。你有没有看到其他结果?我没有 – Jong

1

我通过将音频管理器变量在应用

public class myApplication extends Application { 


    static AudioManager am; 
     public void onCreate() { 
    super.onCreate(); 
    am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
    this.setMute(false); 
     } 
    } 

然后在我的活动类解决问题添加此功能:

private AudioManager getAM() { 
return ((elpApplication)getApplication()).am; 

} 

,这里是我如何使用getAM() ;

private void toogleMediaPlayerMute() { 

    //defaultVolumn = am.getStreamVolume(AudioManager.STREAM_MUSIC); 
    elpApplication app = getElpApp(); 
    Log.d("appmute", String.valueOf(app.isMute())); 
    if (!app.isMute()) { 
     getAM().setStreamVolume(AudioManager.STREAM_MUSIC, 0, 
       AudioManager.FLAG_PLAY_SOUND); 
     getAM().setStreamMute(AudioManager.STREAM_MUSIC, true); 
     ismute = true; 

    } else { 
     int maxVolume = getAM().getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
     Log.d("maxvol", String.valueOf(maxVolume)); 
     getAM().setStreamMute(AudioManager.STREAM_MUSIC, false); 
     getAM().setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume, 
       AudioManager.FLAG_SHOW_UI); 

     ismute = false; 
     // app.setMute(ismute); 
    } 
    app.setMute(ismute); 
} 
+0

是的,那也是我的解决方案。有用。 – Jong

0

我一直有同样的问题w /新版本的API。所以,为了解决这个问题,我实施了一些“老派”解决方案。如果你的设计是这样的,你处理得到的字节流/直接发送字节流 - 如果选择静音发送用零填充字节数组: *

... 
byte[] whatToSend = realByteData; 
byte [] mutedOutput = new byte[recBuffSize]; 
Array.setByte(mutedOutput, 0, (byte) 0); 
... 
if (muteSet) 
    whatToSend = mutedOutput; 

amountWritten = audioTrack.write(whatToSend, 0, amountRead); 

*