Câu trả lời được chấp nhận hoạt động tốt trong muting hệ thống, nhưng nếu bạn cần khôi phục nhà nước (ví dụ như khi người dùng tạm dừng/bỏ ứng dụng của bạn), xin lưu ý rằng ngữ nghĩa của các adjustStreamVolume
và setStreamMute
phương pháp khác nhau:
đối setStreamMute
, từ các tài liệu:
các yêu cầu câm cho một dòng suối đưa ra là tích lũy: các AudioManager có thể nhận được nhiều yêu cầu câm từ o ne hoặc nhiều khách hàng hơn và luồng sẽ chỉ được bật tiếng khi cùng một số nhận được yêu cầu bật số .
Trường hợp này dường như không phải là adjustStreamVolume
với AudioManager.ADJUST_MUTE
. Nói cách khác, nếu trạng thái của luồng đã bị tắt tiếng trước khi bạn tắt âm thanh đó với setStreamMute (stream, true)
, ngay lập tức setStreamMute (stream, false)
sẽ để trạng thái của luồng ở trạng thái tắt tiếng, trong khi adjustStreamVolume
với AudioManager.ADJUST_UNMUTE
có thể bật tiếng luồng.
Tùy thuộc vào trường hợp sử dụng, để bắt chước ngữ nghĩa cũ, một cách là để kiểm tra trạng thái câm trước khi tắt tiếng, giống như sau -
Để tắt:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!audioManager.isStreamMute(stream)) {
savedStreamMuted = true;
audioManager.adjustStreamVolume(stream, AudioManager.ADJUST_MUTE, 0);
}
} else {
audioManager.setStreamMute(stream, true);
}
Để bật tiếng:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (savedStreamMuted) {
audioManager.adjustStreamVolume(stream, AudioManager.ADJUST_UNMUTE, 0);
savedStreamMuted = false;
}
} else {
// Note that this must be the same instance of audioManager that mutes
// http://stackoverflow.com/questions/7908962/setstreammute-never-unmutes?rq=1
audioManager.setStreamMute(stream, false);
}
Giả định người dùng này không thể gọi một ứng dụng khác để tắt luồng ở giữa và mong đợi luồng sẽ tắt tiếng sau khi ứng dụng của bạn bật tiếng (dù sao dường như không có cách nào để kiểm tra điều này).
Ngẫu nhiên, phương pháp isStreamMute
trước đây đã bị ẩn và chỉ được ẩn trong API 23, cho phép sử dụng cho mục đích này.
nhưng không nên có giải pháp tốt hơn cho api dưới 23? – dor00012
Đó là giải pháp. Người khác sẽ thực hiện nếu API nhỏ hơn 23. Về cách duy nhất tôi có thể làm cho nó tốt hơn là quấn nó trong một phương thức. – phxhawke
Bằng cách nói một giải pháp tốt hơn cho api ít hơn 23 tôi có nghĩa là một phương pháp không được chấp nhận - một thay thế cho 'setStreamMute'. Tôi hiểu có lẽ là không, cảm ơn bạn. – dor00012