2012-08-14 49 views
7

Tôi triển khai một bên trong một hoạt động phân đoạn theo thẻ theo số RecognitionListener. Điều xảy ra là khi người dùng cuộn xung quanh, đoạn thực hiện trình nghe được tạo/hủy và trên Nexus 7 và Galaxy Nexus của bạn, bạn nghe thấy âm thanh liên quan đến RegonitionListener hoặc có thể là SpeechRecognizer, sẵn sàng để sử dụng. Lớp nào là nguyên nhân của âm thanh, tôi muốn cho phép người dùng tắt nó. Tôi nhận ra vấn đề hiện tại của tôi là tôi đang lắng nghe mà không tập trung vào người dùng mà tôi đang giải quyết; tuy nhiên, tôi vẫn không muốn nghe âm thanh theo mặc định và muốn cho phép người dùng chọn tham gia vào âm thanh thông báo.Tắt âm thanh 'Sẵn sàng' của trình nghe nhận dạng

Vì vậy, câu hỏi của tôi là điều này, liệu có thể tắt âm thanh thông báo được kết hợp với người nghe không? Tôi đã không thể tìm thấy điều này trong tài liệu.

+2

Tôi đoán âm thanh đó được tạo bởi dịch vụ nhận dạng giọng nói, có nghĩa là ứng dụng của bạn có thể không thay đổi đặc biệt vì tôi không thấy bất kỳ tùy chọn nào cho âm thanh đó trong cài đặt hệ thống hoặc cửa sổ bật lên tìm kiếm bằng giọng nói chính thức. Bạn có thể thử tắt âm lượng trong khi nhận dạng giọng nói nhưng điều đó cũng sẽ tắt tiếng bất kỳ nhạc nền nào có thể đang diễn ra. – zapl

+0

Nhạc nền bị cắt bất kỳ khi nào trình nghe nhận dạng được bắt đầu. Tôi muốn tránh sử dụng một hack nếu có thể mặc dù. Đạo cụ cho ý tưởng! –

Trả lời

14

Như zapl nói rằng không có phương pháp trực tiếp để làm điều đó nhưng bạn có thể thử tắt âm lượng hệ thống và như bạn, Tencent nói rằng bạn đang tránh bất kỳ loại hack. Sau đó, tôi phải nói rằng không có phương pháp SO FAR để làm điều này, Nhưng tôi vẫn đang chia sẻ giải pháp lừa này cho những người đang bị cùng một vấn đề và có thể không nhớ một "hack" lừa. Chỉ cần tiết kiệm giờ thất vọng của họ.

Tắt âm lượng hệ thống trong thời gian cụ thể đó rồi tắt tiếng sau. Làm thế nào để làm điều này:

Trong lớp học của bạn, tạo các đối tượng sau đây

private AudioManager mAudioManager; 
private int mStreamVolume = 0; 

Trong phương pháp onCreate bạn làm như sau.

mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 

Khi bạn bắt đầu nghe cho Speech Recognition, đừng sau

speechRecognizer.startListening(intent); // this method make that annoying sound 
mStreamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); // getting system volume into var for later un-muting 
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0); // setting system volume to zero, muting 

Trong Speech của bạn RecognitionListener giao diện cần có một phương pháp onReadyForSpeech.

class MyRecognitionListener implements RecognitionListener   
{ 
    public void onReadyForSpeech(Bundle params) 
    { 
    // this methods called when Speech Recognition is ready 
    // also this is the right time to un-mute system volume because the annoying sound played already 
    mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mStreamVolume, 0); // again setting the system volume back to the original, un-mutting 
    } 
} 

Đây là cách bạn có thể chơi thủ thuật với âm thanh khó chịu này. Rõ ràng là bất kỳ âm thanh nào khác cũng sẽ bị tắt tiếng trong một giây.

+1

Tôi đặt lại các volumn trong hàm 'public void onResults (Kết quả bó)'. Bởi vì có một âm thanh khác sau khi nhận dạng giọng nói. – William

3

Câu trả lời trước là OK, ngoại trừ câu trả lời sẽ bị lỗi do ngoại lệ NullPointer (getStreamVolume đang được gọi trên đối tượng null). Để khắc phục điều đó, trước khi getStreamVolume dòng add:

AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

0

Nếu bạn muốn stop the end sound là tốt, bạn có thể bật tiếng âm thanh trong onResultsonError thay vì onReadyForSpeech.

Tạo một handler như là một biến thành viên:

private Handler mHandler = new Handler(); 

Các RecognitionListener phương pháp:

@Override 
public void onResults(Bundle results) { 
    // Your logic here 
    startAudioSound(); 
} 

@Override 
public void onError(int errorCode) { 
    // Your logic here 
    startAudioSound(); 
} 

private void startAudioSound(long delay) { 
    mHandler.postDelayed(() -> { 
     mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mStreamVolume, 0); // again setting the system volume back to the original, un-mutting 
    }, 300); 
} 

Tôi đã thử nghiệm với một sự chậm trễ một phần nghìn giây 300 và nó hoạt động. Sự chậm trễ ngắn hơn cũng có thể hoạt động.

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