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的核心功能-语音播放的主要内容,如果未能解决你的问题,请参考以下文章