我认为
AudioManager.STREAM_VOICE_CALL
导致了这个问题。我的设备行为与你的类似。当我运行应用程序时,第一次调用
startTone()
需要长时间初始化。如果我退出并重新进入应用程序,则所有 3 次调用都可以快速完成。但如果在应用程序启动前播放某些系统声音,则会显示相同的“慢、快、快”结果。
因此,我认为它与流切换/阻塞有关,因为在我的设备上使用
AudioManager.STREAM_NOTIFICATION
只需要 4-10 毫秒。您还可以在这里阅读更多信息:
AudioManager 的流类型在低级别上有什么区别?
考虑以下代码:
for (int i = -1; i < 10; i++) {
System.out.println("AudioSystem stream " + i);
mDTMFPlayer = new ToneGenerator(i, TONE_RELATIVE_VOLUME);
long startTime = System.currentTimeMillis();
mDTMFPlayer.startTone(ToneGenerator.TONE_DTMF_0);
Log.d(TAG, "After 1st: " + (System.currentTimeMillis() - startTime));
try {Thread.sleep(160);} catch (InterruptedException e) {}
mDTMFPlayer.stopTone();
startTime = System.currentTimeMillis();
mDTMFPlayer.startTone(ToneGenerator.TONE_DTMF_0);
Log.d(TAG, "After 2nd: " + (System.currentTimeMillis() - startTime));
try {Thread.sleep(160);} catch (InterruptedException e) {}
mDTMFPlayer.stopTone();
startTime = System.currentTimeMillis();
mDTMFPlayer.startTone(ToneGenerator.TONE_DTMF_0);
Log.d(TAG, "After 3rd: " + (System.currentTimeMillis() - startTime));
try {Thread.sleep(160);} catch (InterruptedException e) {}
mDTMFPlayer.stopTone();
mDTMFPlayer.release();
}
输出:
I/System.out: AudioSystem stream -1 STREAM_DEFAULT
D/com.example.MainActivity: After 1st: 8
D/com.example.MainActivity: After 2nd: 1
D/com.example.MainActivity: After 3rd: 1
I/System.out: AudioSystem stream 0 STREAM_VOICE_CALL
D/com.example.MainActivity: After 1st: 325
D/com.example.MainActivity: After 2nd: 1
D/com.example.MainActivity: After 3rd: 1
I/System.out: AudioSystem stream 1 STREAM_SYSTEM
D/com.example.MainActivity: After 1st: 17
D/com.example.MainActivity: After 2nd: 2
D/com.example.MainActivity: After 3rd: 3
I/System.out: AudioSystem stream 2 STREAM_RING
D/com.example.MainActivity: After 1st: 28
D/com.example.MainActivity: After 2nd: 2
D/com.example.MainActivity: After 3rd: 1
I/System.out: AudioSystem stream 3 STREAM_MUSIC
D/com.example.MainActivity: After 1st: 19
D/com.example.MainActivity: After 2nd: 1
D/com.example.MainActivity: After 3rd: 1
I/System.out: AudioSystem stream 4 STREAM_ALARM
D/com.example.MainActivity: After 1st: 28
D/com.example.MainActivity: After 2nd: 1
D/com.example.MainActivity: After 3rd: 1
I/System.out: AudioSystem stream 5 STREAM_NOTIFICATION
D/com.example.MainActivity: After 1st: 16
D/com.example.MainActivity: After 2nd: 1
D/com.example.MainActivity: After 3rd: 1
I/System.out: AudioSystem stream 6 STREAM_BLUETOOTH_SCO
D/com.example.MainActivity: After 1st: 332
D/com.example.MainActivity: After 2nd: 2
D/com.example.MainActivity: After 3rd: 1
I/System.out: AudioSystem stream 7 STREAM_SYSTEM_ENFORCED
D/com.example.MainActivity: After 1st: 324
D/com.example.MainActivity: After 2nd: 1
D/com.example.MainActivity: After 3rd: 1
I/System.out: AudioSystem stream 8 STREAM_DTMF
D/com.example.MainActivity: After 1st: 26
D/com.example.MainActivity: After 2nd: 2
D/com.example.MainActivity: After 3rd: 4
I/System.out: AudioSystem stream 9 STREAM_TTS
D/com.example.MainActivity: After 1st: 12
D/com.example.MainActivity: After 2nd: 4
D/com.example.MainActivity: After 3rd: 2
顺便提一下,如果你想研究相关的C源代码,可以查看android_media_ToneGenerator.cpp, ToneGenerator.h, ToneGenerator.cpp AudioService.java
startTone()
只是调用了一个native
方法(请参见源代码),所以我不确定你能做什么。 - CommonsWare