5

我有一个方法试图创建一个AudioRecord. 不同的手机支持不同的采样率、通道配置和音频格式。因此,该方法尝试AudioRecord为它们中的每一个创建一个并返回第一个有效的方法。

private AudioRecord getAudioRecord() {
    for (int rate: sampleRates) {
        for (int audioFormat: audioFormats) {
            for (int channelConfig: channelConfigs) {
                String description = rate + "Hz, bits: " + audioFormat
                        + ", channel: " + channelConfig;

                Log.d(TAG, "Trying: " + description);

                int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);
                if (bufferSize == AudioRecord.ERROR
                        || bufferSize == AudioRecord.ERROR_BAD_VALUE) {
                    Log.d(TAG, "Failed: This rate/channel config/format is not supported");
                    continue;
                }

                AudioRecord recorder = new AudioRecord(AudioSource.MIC, rate, channelConfig, audioFormat, bufferSize);
                if (recorder.getState() == AudioRecord.STATE_UNINITIALIZED) {
                    Log.d(TAG, "Failed: Recorder is uninitialized");
                    continue;
                }

                Log.d(TAG, "Success: " + description);
                return recorder;
            }
        }
    }

    Log.e(TAG, "Failed all rates. Does the device have a microphone?");
    return null;
}

问题是return recorder永远不会发生!

这是我的 logcat 输出:

日志输出

在突出显示的行 (8000 / 3 / 12) 上没有错误,但也没有成功。

如果我continue在下面的评论中使用 no ,它仍然不会返回!

private AudioRecord getAudioRecord() {
    for (int rate: sampleRates) {
        for (int audioFormat: audioFormats) {
            for (int channelConfig: channelConfigs) {
                String description = rate + "Hz, bits: " + audioFormat
                        + ", channel: " + channelConfig;

                Log.d(TAG, "Trying (2): " + description);

                int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);
                if (bufferSize != AudioRecord.ERROR && bufferSize != AudioRecord.ERROR_BAD_VALUE) {
                    AudioRecord recorder = new AudioRecord(AudioSource.MIC, rate, channelConfig, audioFormat, bufferSize);
                    if (recorder.getState() == AudioRecord.STATE_INITIALIZED) {
                        Log.d(TAG, "Success: " + description);
                        return recorder;
                    } else {
                        Log.d(TAG, "Failed: Recorder is uninitialized");
                    }
                } else {
                    Log.d(TAG, "Failed: This rate/channel config/format is not supported");
                }
            }
        }
    }

    Log.e(TAG, "Failed all rates. Does the device have a microphone?");
    return null;
}
4

2 回答 2

1

return 语句没有问题,您根本无法到达它,因为您的 AudioRecord 从未初始化(大多数示例都没有检查它,即使它们可能应该)

作为一个简短的健全性检查,您可能需要首先检查您的清单文件以验证您是否具有录制音频的适当权限,因为对麦克风的访问是可能/可能不存在的硬件功能。

于 2012-03-03T16:58:23.800 回答
0

将您的函数包装在try/catch块中,您可能会发现某些东西导致抛出异常。

于 2012-02-05T18:40:04.420 回答