public class AudioRecorderActivity extends Activity {
private static final int RECORDER_SAMPLERATE = 8000;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private AudioRecord recorder = null;
private static final String TAG = "AudioRecorderActivity";
short[][] buffers = new short[256][160];
int ix = 0;
private boolean stopped = false;
private void startRecording() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
try {
int N = AudioRecord.getMinBufferSize (
RECORDER_SAMPLERATE,
RECORDER_CHANNELS,
RECORDER_AUDIO_ENCODING) * 20;
recorder = new AudioRecord(AudioSource.MIC,
RECORDER_SAMPLERATE,
RECORDER_CHANNELS,
RECORDER_AUDIO_ENCODING,N );
recorder.startRecording();
while(!stopped) {
short[] buffer = buffers[ix++ % buffers.length];
N = recorder.read(buffer,0,buffer.length);
}
}
catch(Throwable x) {
Log.v(TAG,"Error reading voice audio",x);
x.printStackTrace();
}
finally {
stopped = true;
stopRecording();
}
}
}
问题:虽然代码段基于StackOverflow的一个例子,但它无法正常工作 请让我知道可能是什么错误?
12-20 03:44:32.271: E/AudioRecord(224): AudioFlinger could not create record track, status: -1
12-20 03:44:32.271: E/AudioRecord-JNI(224): Error creating AudioRecord instance: initialization check failed.
12-20 03:44:32.271: E/AudioRecord-Java(224): [ android.media.AudioRecord ] Error code -20 when initializing native AudioRecord object.
答案 0 :(得分:38)
为AndroidManifest.xml添加record_audio权限
<uses-permission android:name="android.permission.RECORD_AUDIO" />
答案 1 :(得分:11)
在最近的Android版本中,似乎在更改清单中的权限后从Android Studio中删除apk实际上并未更改应用设置中的权限。这就是上述答案对我有用的原因。我在清单中构建了一个没有RECORD_AUDIO权限的应用程序,并在我的日志中看到了权限错误(以及OP中的错误)。我将权限添加到我的清单并重新启动设备上的应用程序,日志中的权限错误不再存在,但我仍然在OP中遇到错误。我去了我的系统,应用程序,应用程序管理器 - &gt; MyApp - &gt;权限,并看到Record Audio已列出但仍然关闭。手动转动它固定它。
我想(但尚未确认)如果我首先在我的清单中建立了正确的权限,那么这对我来说就是有效的。或者,从设备卸载我的应用程序,然后重新安装,也可能会修复,但我也没有尝试过。
答案 2 :(得分:3)
预先Marshmallow版本的android解决方案与Olexij提到的相同......
<uses-permission android:name="android.permission.RECORD_AUDIO" />
但是,在启动Android API 23(Marshmallow)时,这被认为是危险的权限,您必须在使用它的Activity中请求此权限。 戴夫的经历就是这样的结果;如果你在Manifest中声明了权限但是没有在运行时请求(至少第一次),那么它将在应用程序管理器中的应用程序权限中显示,但将保持关闭状态。
检查...
答案 3 :(得分:2)
API 23(Marshmallow)的解决方案很简单。你必须设置&#34; targetSdkVersion 22&#34;在获得波纹管权限后,在bulid.gradle文件中。
答案 4 :(得分:0)
给予明确许可为我解决了这个问题。
尝试以下步骤
Android Version 7.0
Settings -> Applications -> <MyAPP> -> Permissions
-> [Turn Camera and Microphone ON]