2015-10-10 17 views
8

AudioManger.setStreamMute hiện đang bị phản đối với api 23 và nó được ưa thích sử dụng AudioManager.adjustStreamVolume với AudioManager.ADJUST_MUTE.Thay thế cho việc không dùng AudioManger.setStreamMute?

Vấn đề của tôi là loại cờ chỉ được hỗ trợ với api 23 trong khi ứng dụng của tôi là api tối thiểu 16.

Có cách nào khác để tắt tiếng toàn bộ hệ thống không?

Nếu không, tại sao Google sẽ không dùng phương pháp này?

Trả lời

14

Cách tôi sẽ làm là sử dụng khối if/else để sử dụng các cuộc gọi thích hợp tùy thuộc vào phiên bản Android mà ứng dụng hiện đang chạy.

// Change the stream to your stream of choice. 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ 
    am.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, 0); 
} else { 
    am.setStreamMute(AudioManager.STREAM_MUSIC, true); 
} 
+0

nhưng không nên có giải pháp tốt hơn cho api dưới 23? – dor00012

+0

Đó 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

+0

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

7

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 adjustStreamVolumesetStreamMute 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.

Các vấn đề liên quan