android - 第二声音播放时不够完整?

标签 android audio headset speakerphone

我想按下耳机上的按钮,通过扬声器播放声音,然后录制10秒钟的音频剪辑。这是我的代码:

        SoundPool soundPool;
        HashMap<Integer, Integer> soundPoolMap;
        soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
        soundPoolMap = new HashMap<Integer, Integer>();
        soundPoolMap.put(SOUND_RECORD_ON,
                soundPool.load(context, R.raw.on, 1));
        soundPoolMap.put(SOUND_RECORD_OFF,
                soundPool.load(context, R.raw.off, 1));

        AudioManager mAudioManager = (AudioManager) context
                .getSystemService(Context.AUDIO_SERVICE);
        float streamVolumeMax = mAudioManager
                .getStreamMaxVolume(AudioManager.STREAM_MUSIC);

        if (recordStarted == false) {
            try { // start recording
                audioRecorder.start();
                recordStarted = true;
                System.out.println(String.format("recording: %s",
                        recordStarted));

                mAudioManager.setMode(AudioManager.MODE_IN_CALL);
                mAudioManager.setSpeakerphoneOn(true);
                System.out.println("speaker on");
                soundPool.play(soundPoolMap.get(SOUND_RECORD_ON),
                        streamVolumeMax, streamVolumeMax, 1, 0, 1f);

            } catch (IOException e) {
                e.printStackTrace();
            }
        } else { // stop recording
            try {
                audioRecorder.stop();
                recordStarted = false;
                System.out.println(String.format("recording: %s",
                        recordStarted));

                mAudioManager.setMode(AudioManager.MODE_IN_CALL);
                mAudioManager.setSpeakerphoneOn(true);
                System.out.println("speaker on");
                soundPool.play(soundPoolMap.get(SOUND_RECORD_ON),
                        streamVolumeMax, streamVolumeMax, 2, 0, 1f);

            } catch (IOException e) {
                e.printStackTrace();
            }

第一个声音可以很好地在扬声器上播放,并具有很好的完整性。但是,当我再次按下按钮停止录制时,尽管使用了相同的剪辑,声音还是几乎听不到。这是logcat跟踪:
ERROR/MediaButtonIntentReceiver(5290): <!> MediaButtonIntentReceiver 52<!> BUTTON PRESSED :D 
WARN/StagefrightRecorder(1466): Target duration (10000000 us) too short to be respected
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=2,mCurSndDevice=-1
ERROR/AudioHardwareMSM72XX(1466): [SKW]do_route_audio_rpc(2, 1, 0)
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=2,mCurSndDevice=2
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=2,mCurSndDevice=2
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=2,mCurSndDevice=-1
ERROR/AudioHardwareMSM72XX(1466): [SKW]do_route_audio_rpc(2, 1, 0)
INFO/System.out(5290): recording: true
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): Routing audio to Speakerphone_conversation
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=7,mCurSndDevice=-1
ERROR/AudioHardwareMSM72XX(1466): [SKW]do_route_audio_rpc(7, 0, 0)
ERROR/AudioService(1586): <!>android.media.AudioService 895<!> [BTUI] [SCO] ### setMode (2)
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): Routing audio to Speakerphone_conversation
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=7,mCurSndDevice=7
INFO/System.out(5290): speaker on
WARN/AudioFlinger(1466): write blocked for 138 msecs, 71 delayed writes, thread 0xce08
ERROR/SUMAN-statusbarpolicy(1665): <!>com.android.systemui.statusbar.policy.StatusBarPolicy 1069<!> mServiceState.getRoaming()false
DEBUG/StatusBarPolicy(1665): [BRIGHTHY] 0. mDataNetType: 8
DEBUG/StatusBarPolicy(1665): [BRIGHTHY] curNetwork=302880 curHPLMN=302220
WARN/KeyCharacterMap(5290): No keyboard for id 0
WARN/KeyCharacterMap(5290): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
ERROR/MediaButtonIntentReceiver(5290): <!> MediaButtonIntentReceiver 52<!> BUTTON PRESSED :D 
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=2,mCurSndDevice=-1
ERROR/AudioHardwareMSM72XX(1466): [SKW]do_route_audio_rpc(2, 0, 0)
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): Routing audio to Speakerphone_conversation
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=7,mCurSndDevice=2
ERROR/AudioHardwareMSM72XX(1466): [SKW]do_route_audio_rpc(7, 0, 0)
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): Routing audio to Speakerphone_conversation
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=7,mCurSndDevice=-1
ERROR/AudioHardwareMSM72XX(1466): [SKW]do_route_audio_rpc(7, 0, 0)
INFO/System.out(5290): recording: false
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): Routing audio to Speakerphone_conversation
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=7,mCurSndDevice=7
INFO/System.out(5290): speaker on

有人知道为什么会这样吗?我知道在第一部分中我没有将扬声器电话设置为假。如果我这样做,声音只会通过耳机播放。我怀疑这句话说的是“太短了,不值得尊重”。
非常感谢你!

---------用媒体播放器代码更新-------------
    if (action == KeyEvent.ACTION_DOWN) {
        Log.e(TAG, "BUTTON PRESSED :D ");

        AudioManager mAudioManager = (AudioManager) context
                .getSystemService(Context.AUDIO_SERVICE);
        MediaPlayer playOn = MediaPlayer.create(context, R.raw.on);

        if (recordStarted == false) {
            try { // start recording

                audioRecorder.start();
                recordStarted = true;
                System.out.println(String.format("recording: %s",
                        recordStarted));

                mAudioManager.setMode(AudioManager.MODE_IN_CALL);
                mAudioManager.setSpeakerphoneOn(true);
                System.out.println("speaker on");

                playOn.start();
                System.out.println("playing on tune");

            } catch (IOException e) {
                e.printStackTrace();
            }
        } else { // stop recording
            try {
                audioRecorder.stop();
                recordStarted = false;
                System.out.println(String.format("recording: %s",
                        recordStarted));

                playOn.start();
                System.out.println("playing off tune");

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // mAudioManager.setSpeakerphoneOn(false);
                // System.out.println("speaker off");
                // mAudioManager.setMode(AudioManager.MODE_NORMAL);
            }
        } // end else
    } // end key down action

好的,可以使用此代码播放声音,但是第二个声音仍然非常安静(与以前相同的问题)...更多建议? :D

最佳答案

事实证明,我不应该在BroadcastReceiver中播放音乐(检测到媒体按钮),因为音乐只会持续执行onReceive的时间。因此,必须创建服务才能在录制之前播放。

关于android - 第二声音播放时不够完整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7587715/

相关文章:

android - 如何让点对点 WiFi 服务发现工作?

android - 如何在不重新创建布局的情况下旋转方向变化的 View ?

android - 如何在自定义 ListView 中获取当前行 View ?

android - 使用耳机按钮录制声音

XML 文件中的 Java 错误 : aborting build

html - 音频API:无法恢复音乐并对其进行可视化。 html5-audio中是否有bug?

javascript - 如何直接从浏览器录制音频

android - 单击应用程序按钮时立即运行音频文件 (Android)

Android 2.2 以编程方式判断我的蓝牙耳机是否在应用程序启动时连接

android - 检测三星耳机 Android 中的按钮按下