众所周知,android6.0引入了新的权限机制,开发者可以使用checkSelfPermission()和requestPermissions()很轻松的检测并获取相应的录音权限。但是在6.0以下我们该如何判断app是否具有录音权限呢?

以某应用为例,我们把该应用的录音权限给禁止掉,然后开始录音来看看它是如何处理的。

6.0系统上的界面

IMG_20160622_193532

在6.0设备上该app会自动检测是否具有录音权限并设法建议用户去给app授权。

5.0上的界面

05169ec3-21c2-41c9-be26-455d200b95a2

在6.0以下的系统上该使用该app发送语音,会出现录音界面但是不会进行真正的录音,松开手指后不会有录音文件发送。


 

如上,在6.0的环境下我们可以很简单的判断应用是否具有录音权限,但是在爱6.0以下就麻烦,所以我们需要另外一种权限检测的方法,来兼容不同版本。

不多说,直接上代码,原理很简单,根据录音的状态、录音文件的大小和相应的异常处理完成对录音权限的判断.

package com.xdja.jxclient.utils;

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.widget.Toast;

import com.jmolsmobile.landscapevideocapture.CLog;

/**
 * Created by fzl on 2016/6/22.
 */
public class CheckAudioPermission {
public  static final int STATE_RECORDING=-1;
public  static final int STATE_NO_PERMISSION=-2;
public  static final int STATE_SUCCESS=1;
    /**
     * 用于检测是否具有录音权限
     *
     * @return
     */
    public static int getRecordState() {
        int minBuffer = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
        AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, (minBuffer * 100));
        short[] point = new short[minBuffer];
        int readSize = 0;
        try {

            audioRecord.startRecording();//检测是否可以进入初始化状态
        } catch (Exception e) {
            if (audioRecord != null) {
                audioRecord.release();
                audioRecord = null;
                CLog.d("CheckAudioPermission","无法进入录音初始状态");
            }
            return STATE_NO_PERMISSION;
        }
        if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
            //6.0以下机型都会返回此状态,故使用时需要判断bulid版本
            //检测是否在录音中
            if (audioRecord != null) {
                audioRecord.stop();
                audioRecord.release();
                audioRecord = null;
                CLog.d("CheckAudioPermission","录音机被占用");
            }
            return STATE_RECORDING;
        } else {
            //检测是否可以获取录音结果

            readSize = audioRecord.read(point, 0, point.length);


            if (readSize <=0) {
                if (audioRecord != null) {
                    audioRecord.stop();
                    audioRecord.release();
                    audioRecord = null;

                }
                CLog.d("CheckAudioPermission","录音的结果为空");
                return STATE_NO_PERMISSION;

            } else {
                if (audioRecord != null) {
                    audioRecord.stop();
                    audioRecord.release();
                    audioRecord = null;

                }

                return STATE_SUCCESS;
            }
        }
    }
}