在文档中,有人说:
保护静音命令免受客户端进程死亡的影响:如果流上有活动静音请求的进程终止,则此流将自动取消静音。
对给定流的静音请求是累积的:AudioManager可以从一个或多个客户端接收几个静音请求,只有在收到相同数量的取消静音请求时才会取消静音。
嗯,第一段是真的;每当我的进程终止时,我静音的所有流都会自动取消静音。
但是,无论我拨打setStreamMute(someStream, false)
多少次,它都永远无法取消静音。
上次我在静音后尝试调用它超过100万次而且没有发生!
提一下 - 如果我用相同的方法取消静音,我将其静音 - 它保持不变。但是在下一次调用相同的方法时 - 它永远不会取消静音。
我在广播接收器onReceive方法中静音,我开始使用警报管理器。也许是因为我的应用程序在静音呼叫和取消静音呼叫之间被杀死了? (但我的应用程序仍然留在RAM中)
这个问题可能是因为我没有保留对AlarmManager的引用(每次都有不同的实例吗?)
有没有人遇到过这个问题?
答案 0 :(得分:21)
显然,是这些Android版本中的错误;测试版本2.2和2.3.3并且存在错误。
看起来,如果你在AudioManager对象上调用setStreamMute
:
AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
am.setStreamMute(...., true);
您丢失您的参考,然后获得新参考:
am = null;
am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
无论 ,现在多次拨打am.setStreamMute(..., false)
,永远不会取消静音。
我认为现在报告这个错误...
课程:保留对音频管理器的静态引用。
@Michell Bak,谢谢你给我一个检查它是否是Android软件bug的想法:)我已经被困在这个东西太多时间了,我从来没有想过看看它不是我的错
答案 1 :(得分:1)
我之前从未使用过该API,但是快速的Google搜索,返回了一些不起作用的结果。它似乎是一个仍然存在于Android 2.3中的错误:
答案 2 :(得分:1)
我通过将音频管理器变量放在应用程序中来解决问题
public class myApplication extends Application {
static AudioManager am;
public void onCreate() {
super.onCreate();
am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
this.setMute(false);
}
}
然后在我的activity类中添加这个函数:
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);
}
答案 3 :(得分:0)
我遇到了与新版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);
*