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.

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

发布了70 篇原创文章 · 获赞 75 · 访问量 27万+

猜你喜欢

转载自blog.csdn.net/qq_22770457/article/details/88824113
今日推荐