Andorid实现皮皮蟹App的核心功能-语音播放

Posted 化作孤岛的瓜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Andorid实现皮皮蟹App的核心功能-语音播放相关的知识,希望对你有一定的参考价值。

今天在跑一家面试的时候被问到能不能实现皮皮蟹的录音播放功能:

概括起来就是在皮皮蟹里面选择需要播放的音频,保存到本地,然后跳转到微信点击录音的时候播放该音频,乍看一下感觉这个问题其实挺简单的,但是后面尝试了一下其实并不简单。

思路1:

通过判断麦克风是否被占用来获取在微信中录音的行为"回调",百度出来的方法大同小异,都是:

    private boolean validateMicAvailability()
        Boolean available = true;

        recorder = new AudioRecord(MediaRecorder.Audiosource.MIC, 44100,
                        AudioFormat.CHANNEL_IN_MONO,
                        AudioFormat.ENCODING_DEFAULT, 44100);

        if (recorder == null )  
            return false;
        
         try


             if(recorder.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED )
                available = false;

            

            recorder.startRecording();

            if(recorder.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING)
                recorder.stop();
                available = false;

            
            recorder.stop();
         finally
            if (recorder!=null) 
                recorder.release();
                recorder = null;
            
        

        return available;
    

然后测试的思路是开启一个Service,在服务里运行timetask去循环判断,如果返回值为false说明当前有其他程序正在占用麦克风,则此时用户在微信点击了麦克风,就可以播放本地的音频了。

但是实际运行的时候出现了问题,微信会弹出一个当前有其他程序正在录音的弹窗,明显皮皮蟹是没有这个弹窗的,所以思路1pass。

思路2:

注意到皮皮蟹是有悬浮窗权限的,也有悬浮窗,当时有想是不是通过判断微信的悬浮窗来得知用户按下了录音按钮,但是后面把皮皮蟹的悬浮窗权限关了,他还是可以实现监听。思路2pass。

思路3:

最后在参考文章:https://stackoverflow.com/questions/12018927/check-if-android-mic-is-being-used-by-another-app/12019367?r=SearchResults#12019367 时,虽然答主没有给出具体的解决方案,但是有提到通过AudioManager去解决这个问题,然后我就试了am.isMicrophoneMute(),发现无法解决,最后,使用requestAudioFocus解决了问题,以下是代码:

 AudioManager am;
            am = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
            int result = am.requestAudioFocus(new AudioManager.OnAudioFocusChangeListener() 
                                                  @Override
                                                  public void onAudioFocusChange(int focusChange) 
                                                      LogUtils.d("nangua : " + focusChange);
                                                  
                                              ,
                    AudioManager.STREAM_MUSIC,
                    AudioManager.AUDIOFOCUS_GAIN);

平时focusChange返回的结果是1,当跳转到其他app比如微信里面,点击录音按钮时会返回2.

以上,就是实现皮皮蟹最重要的功能的关键所在哈哈哈,搞了半天终于有了正解。

以上是关于Andorid实现皮皮蟹App的核心功能-语音播放的主要内容,如果未能解决你的问题,请参考以下文章

如何使用arduino通过说出歌曲的名字来播放音乐?

uniapp实战笔记实现语音播放功能

uniapp实现语音播放功能

uniapp实现语音播放功能

uniapp实现语音播放功能

第六十九篇OC_录制语音和播放语音功能的实现