如何知道我的应用程序的AudioRecord权限是否被禁止

3

我的应用被用户禁止了录音权限。问题在于,一些安卓系统设备上 `audio_recorder.getRecordingState()` 总是返回 `AudioRecord.RECORDSTATE_RECORDING`,这不是一个正确的结果。

我该如何知道录音权限是否可用?

public final class MtAudioRecord {

private static final String TAG = "audioRecord";
private static MtAudioRecord instance = null;
public static int SAMPLE_RATE = 44100;// default 44100
public static final int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
public static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
public static final int AUDIO_SOURCE = MediaRecorder.AudioSource.MIC;

private AudioRecord mAudioRecord;
private final int minBufferSize;
private boolean isRecording = true;
private static short[] audioData = null;

public static final MtAudioRecord getInstance() {
    if (null == instance) {
        instance = new MtAudioRecord();
    }
    return instance;
}

public MtAudioRecord() {
    minBufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT);
    if (minBufferSize == AudioRecord.ERROR_BAD_VALUE) {
    } else if (minBufferSize == AudioRecord.ERROR) {
    } else {
        mAudioRecord =
            new AudioRecord(AudioSource.MIC, SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_PCM_16BIT, minBufferSize);
    }
    audioData = new short[minBufferSize];
}

public synchronized void start() {

    new Thread(new Runnable() {

        @Override
        public void run() {
            if(null != mAudioRecord){
                if (mAudioRecord.getRecordingState() != AudioRecord.STATE_INITIALIZED) {
                    Log.e(TAG, "Mic didn't successfully initialized");
                    return;
                }
                mAudioRecord.startRecording();
                Log.e(TAG, "recording state = " + mAudioRecord.getRecordingState());
                if (mAudioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
                    Log.e(TAG, "Mic is in use and can't be accessed");
                    return;
                }
                isRecording = true;
                while (isRecording && null != mAudioRecord) {
                    if (null == audioData) {
                        audioData = new short[minBufferSize];
                    }
                    final int read_distance = mAudioRecord.read(audioData, 0, minBufferSize);
                    if (read_distance == AudioRecord.ERROR_INVALID_OPERATION || read_distance == AudioRecord.ERROR || read_distance == AudioRecord.ERROR_BAD_VALUE) {
                        isRecording = false;
                        break;
                    }
                }
                if (mAudioRecord != null) {
                    mAudioRecord.stop();
                    mAudioRecord.release();
                    mAudioRecord = null;
                }
            }
        }
    }).start();
}

public synchronized void stop() {
    isRecording = false;
}

}

<uses-permission android:name="android.permission.RECORD_AUDIO"/>
1个回答

1

我认为你应该使用AudioManager来检查用户是否将麦克风静音。你可能正在寻找的方法是isMicrophoneMute(),它返回一个布尔值。

这是Android开发者网站上的AudioManager链接Android Audio Manager

功能描述在这里here

而且你的弹出提示是不正确的,应该是:

Toast.makeText(applicationContext(),"The microphone is 
                                   disabled",Toast.LENGTH_SHORT).show();

更新: 您可以使用Context.checkCallingOrSelfPermission(String permission);

permission是描述所需权限的字符串:android.permission.RECORD_AUDIO

它应该返回整数结果,即PERMISSION_GRANTED或PERMISSION_DENIED

在Android开发者网站上查看此处的说明:检查权限

例如:

public boolean checkRecordingPermission()
{
    String permission = "android.permission.RECORD_AUDIO";
    int result  = getContext().checkCallingOrSelfPermission(permission);
    return (result == PackageManager.PERMISSION_GRANTED);
}

首先感谢您,但是'AudioManager isMicrophoneMute()'返回'false'。所以这种方式不是最好的。您有其他想法吗? - Pengfei Zeng
您想从应用程序检查麦克风是否关闭,然后打开它吗? - Elior
抱歉,我又编辑了这个问题。请看一下。非常感谢。 - Pengfei Zeng
嗨,我这样做,但它也返回“PERMISSION_GRANTED”。因为我在我的AndroidMainfest.xml中定义了“record audio”权限。你知道一个叫“小米”的设备吗? - Pengfei Zeng
不,我没有...但这无关紧要,Android在所有设备中都是Android :) 当您在Manifest文件中定义权限时,它已经被授予了...因此,它将返回“TRUE”。 - Elior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接