2010-01-03 31 views
10

Xin chào, tôi là người mới. Dự án tự học của tôi là một ứng dụng nhỏ đóng luồng tin tức âm thanh. Để có hiệu quả, ứng dụng thực sự cần phải ngắt bất kỳ trình phát media hiện đang phát nào (ví dụ: FM lần cuối, Imeem, trình phát nhạc, Spotify, v.v.).Android - Tôi có thể tắt tiếng hiện đang phát các ứng dụng âm thanh không?

Tôi không biết nội dung sẽ phát hoặc ứng dụng nào sẽ phát, nhưng tôi muốn yêu cầu tất cả tạm dừng cho đến khi tôi hoàn thành. Nghe có vẻ táo bạo, tôi biết, nhưng nó phải là có thể, bởi vì khi có một cuộc gọi đến, đó là cơ bản những gì sẽ xảy ra.

Tôi có thể gửi tin nhắn cho tất cả người chơi âm thanh yêu cầu họ tạm dừng không? Tôi có thể giả mạo một cuộc gọi đến, chỉ trong thời gian cần thiết không?

Cảm ơn.

Trả lời

18

âm thanh xử lý trên Android sẽ là khá khủng khiếp trong một thời gian. Các API khá kỳ lạ, kém tài liệu và tiếp tục thay đổi/không dùng/phá vỡ giữa các phiên bản. Ngay cả mã AudioManager cũng có FIXME trong đó.

Dù sao, có một số loại luồng trong Android (nhạc, thông báo, cuộc gọi điện thoại, v.v.) và các ứng dụng có nghĩa là chọn một loại thích hợp để phát lại. Tôi tưởng tượng phần lớn ứng dụng Android nên sử dụng loại nhạc/phương tiện (STREAM_TYPE_MUSIC). Bạn đặt cài đặt này trên số MediaPlayer bằng phương pháp setAudioStreamType.

SDK không cho phép bạn thiết lập một dòng đơn loại như độc tấu — gây ra tất cả các dòng khác được tắt — nhưng tôi không tin bạn có thể xác định các âm thanh được phát trở lại bởi các ứng dụng cụ thể và bằng cách nào đó tạm dừng/hủy tạm nó. Ứng dụng nhạc nói chung sẽ sử dụng số PhoneStateListener để tạm dừng khi có cuộc gọi đến.

Vì vậy, bạn có thể "mượn" luồng cuộc gọi điện thoại MediaPlayer và sử dụng phương thức gọi AudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true) khi phát lại bắt đầu, sau đó nhấn -solo luồng với false khi phát lại hoặc Activity của bạn được thực hiện.

tôi có thể cho bạn biết rằng làm việc này, nhưng tôi không thể nhớ ngay cho dù bạn cũng cần phải thiết lập âm thanh chế độ-MODE_IN_CALL khi sử dụng dòng cuộc gọi thoại (như thế này: AudioManager.setMode(AudioManager.MODE_IN_CALL)). Nếu bạn thấy điều đó là bắt buộc, thì bạn cần phải đảm bảo bạn trả lại chế độ thành MODE_NORMAL khi phát lại hoàn tất, nếu không, bất cứ khi nào bạn nhấn các phím cứng âm lượng, nó sẽ nói "Âm lượng trong cuộc gọi"! Tuy nhiên, nếu và khi bạn muốn đổi lại thành MODE_NORMAL, bạn phải kiểm tra xem cuộc gọi điện thoại chính hãng có xảy ra không tại thời điểm đó ...

Có thể bạn có thể sử dụng loại luồng khác thay vì loại cuộc gọi thoại, nhưng tôi chỉ nói từ kinh nghiệm làm việc trên một ứng dụng có thể sử dụng loa ngoài hoặc tai nghe để phát lại âm thanh, trong đó yêu cầu việc sử dụng luồng cuộc gọi thoại.

Như tôi đã nói, xử lý âm thanh không phải là đặc biệt thú vị ...;)

+0

Cảm ơn Christopher, lời khuyên của bạn là chỗ trên. Tôi đã thực sự bị tấn công, STREAM_ALARM, phù hợp với mục đích của tôi, đặt nó thành solo và điều này có hiệu quả mong muốn. Cảm ơn một lần nữa. –

+0

Rất tiếc, không phải một ý tưởng hay, ít nhất là không có tai nghe. Quay lại VOICE_CALL. Dường như không cần MODE_IN_CALL, ít nhất là không xa. –

0

Bạn có thể thử phương pháp AudioManager.adjustVolume:

AudioManager audioMan = 
    (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
audioMan.adjustVolume(AudioManager.ADJUST_LOWER, 
    AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); 
6

Nó đã được 2 năm.Nhưng tôi hy vọng điều này có thể giúp ai đó:

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

Lưu ý: nếu bạn gọi setStreamMute(int, boolean) để tắt dòng n lần, bạn phải gọi nó là n lần một lần nữa để bật tiếng (sử dụng false).

+0

nó hoạt động tốt cảm ơn u :) – Ramz

2
+0

Vấn đề duy nhất với điều này là nếu các ứng dụng khác không tôn trọng yêu cầu tập trung âm thanh. – StackOverflowed

+1

đúng, mặc dù nếu bạn sử dụng các cờ TRANSIENT, hầu hết sẽ. Tất cả chúng ta nên cố gắng trở thành những công dân tập trung vào âm thanh tốt! – yano

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