vendredi 23 janvier 2015

java.lang.IllegalArgumentException: Invalid audio buffer size

i have got an error while trying to record an audio in android. i have already created the external storage permission and record audio permission as well in my Manifest.xml .....please can someone help me to solve this problem. because um new to this android and java field.please help me to fix this soon as possible.. here is my audio recording code thank you !!!



public class RecorderActivity extends Activity {
private static final int RECORDER_BPP = 16;
private static final String AUDIO_RECORDER_FILE_EXT_WAV = ".wav";
private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder";
private static final String AUDIO_RECORDER_TEMP_FILE = "record_temp.raw";
private static final int RECORDER_SAMPLERATE = 44100;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

private AudioRecord recorder = null;
private int bufferSize = 0;
private Thread recordingThread = null;
private boolean isRecording = false;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

setButtonHandlers();
enableButtons(false);

bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING);
}

private void setButtonHandlers() {
((Button)findViewById(R.id.btnStart)).setOnClickListener(btnClick);
((Button)findViewById(R.id.btnStop)).setOnClickListener(btnClick);
}

private void enableButton(int id,boolean isEnable){
((Button)findViewById(id)).setEnabled(isEnable);
}

private void enableButtons(boolean isRecording) {
enableButton(R.id.btnStart,!isRecording);
enableButton(R.id.btnStop,isRecording);
}

private String getFilename(){
String filepath = Environment.getExternalStorageDirectory().getPath();
File file = new File(filepath,AUDIO_RECORDER_FOLDER);

if(!file.exists()){
file.mkdirs();
}

return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + AUDIO_RECORDER_FILE_EXT_WAV);
}

private String getTempFilename(){
String filepath = Environment.getExternalStorageDirectory().getPath();
File file = new File(filepath,AUDIO_RECORDER_FOLDER);

if(!file.exists()){
file.mkdirs();
}

File tempFile = new File(filepath,AUDIO_RECORDER_TEMP_FILE);

if(tempFile.exists())
tempFile.delete();

return (file.getAbsolutePath() + "/" + AUDIO_RECORDER_TEMP_FILE);
}

private void startRecording(){
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
RECORDER_SAMPLERATE, RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING, bufferSize);
int state = recorder.getState();
if (state == AudioRecord.STATE_INITIALIZED){
recorder.startRecording();
isRecording = true;
}

recordingThread = new Thread(new Runnable() {

@Override
public void run() {
writeAudioDataToFile();
}
},"AudioRecorder Thread");

recordingThread.start();
}

private void writeAudioDataToFile(){
byte data[] = new byte[bufferSize];
String filename = getTempFilename();
FileOutputStream os = null;

try {
os = new FileOutputStream(filename);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

int read = 0;

if(null != os){
while(isRecording){
read = recorder.read(data, 0, bufferSize);

if(AudioRecord.ERROR_INVALID_OPERATION != read){
try {
os.write(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}

try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

private void stopRecording(){
if (recorder != null) {
isRecording = false;
int state = recorder.getState();
if (state == AudioRecord.STATE_INITIALIZED){
recorder.stop(); recorder.release();
recorder = null;
recordingThread = null;
}
}

copyWaveFile(getTempFilename(),getFilename());
deleteTempFile();
}

private void deleteTempFile() {
File file = new File(getTempFilename());

file.delete();
}

private void copyWaveFile(String inFilename,String outFilename){
FileInputStream in = null;
FileOutputStream out = null;
long totalAudioLen = 0;
long totalDataLen = totalAudioLen + 36;
long longSampleRate = RECORDER_SAMPLERATE;
int channels = 2;
long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels/8;

byte[] data = new byte[bufferSize];

try {
in = new FileInputStream(inFilename);
out = new FileOutputStream(outFilename);
totalAudioLen = in.getChannel().size();
totalDataLen = totalAudioLen + 36;

AppLog.logString("File size: " + totalDataLen);

WriteWaveFileHeader(out, totalAudioLen, totalDataLen,
longSampleRate, channels, byteRate);

while(in.read(data) != -1){
out.write(data);
}

in.close();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

private void WriteWaveFileHeader(
FileOutputStream out, long totalAudioLen,
long totalDataLen, long longSampleRate, int channels,
long byteRate) throws IOException {

byte[] header = new byte[44];

header[0] = 'R'; // RIFF/WAVE header
header[1] = 'I';
header[2] = 'F';
header[3] = 'F';
header[4] = (byte) (totalDataLen & 0xff);
header[5] = (byte) ((totalDataLen >> 8) & 0xff);
header[6] = (byte) ((totalDataLen >> 16) & 0xff);
header[7] = (byte) ((totalDataLen >> 24) & 0xff);
header[8] = 'W';
header[9] = 'A';
header[10] = 'V';
header[11] = 'E';
header[12] = 'f'; // 'fmt ' chunk
header[13] = 'm';
header[14] = 't';
header[15] = ' ';
header[16] = 16; // 4 bytes: size of 'fmt ' chunk
header[17] = 0;
header[18] = 0;
header[19] = 0;
header[20] = 1; // format = 1
header[21] = 0;
header[22] = (byte) channels;
header[23] = 0;
header[24] = (byte) (longSampleRate & 0xff);
header[25] = (byte) ((longSampleRate >> 8) & 0xff);
header[26] = (byte) ((longSampleRate >> 16) & 0xff);
header[27] = (byte) ((longSampleRate >> 24) & 0xff);
header[28] = (byte) (byteRate & 0xff);
header[29] = (byte) ((byteRate >> 8) & 0xff);
header[30] = (byte) ((byteRate >> 16) & 0xff);
header[31] = (byte) ((byteRate >> 24) & 0xff);
header[32] = (byte) (2 * 16 / 8); // block align
header[33] = 0;
header[34] = RECORDER_BPP; // bits per sample
header[35] = 0;
header[36] = 'd';
header[37] = 'a';
header[38] = 't';
header[39] = 'a';
header[40] = (byte) (totalAudioLen & 0xff);
header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
header[43] = (byte) ((totalAudioLen >> 24) & 0xff);

out.write(header, 0, 44);
}

private View.OnClickListener btnClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btnStart:{
AppLog.logString("Start Recording");

enableButtons(true);
startRecording();

break;
}
case R.id.btnStop:{
AppLog.logString("Start Recording");

enableButtons(false);
stopRecording();

break;
}
}
}
};
}




01-24 11:41:46.470: W/dalvikvm(1671): threadid=1: thread exiting with uncaught exception (group=0xb3fd3288) 01-24 11:41:46.470: E/AndroidRuntime(1671): FATAL EXCEPTION: main 01-24 11:41:46.470: E/AndroidRuntime(1671): java.lang.IllegalArgumentException: Invalid audio buffer size. 01-24 11:41:46.470: E/AndroidRuntime(1671):

at android.media.AudioRecord.audioBuffSizeCheck(AudioRecord.java:333) 01-24 11:41:46.470: E/AndroidRuntime(1671):

at android.media.AudioRecord.(AudioRecord.java:230) 01-24 11:41:46.470: E/AndroidRuntime(1671):

at com.example.audiorecorder.RecorderActivity.startRecording(RecorderActivity.java:86) 01-24 11:41:46.470: E/AndroidRuntime(1671):

at com.example.audiorecorder.RecorderActivity.access$1(RecorderActivity.java:84) 01-24 11:41:46.470: E/AndroidRuntime(1671):

at com.example.audiorecorder.RecorderActivity$1.onClick(RecorderActivity.java:258) 01-24 11:41:46.470: E/AndroidRuntime(1671):

at android.view.View.performClick(View.java:4084) 01-24 11:41:46.470: E/AndroidRuntime(1671):

at android.view.View$PerformClick.run(View.java:16966) 01-24 11:41:46.470: E/AndroidRuntime(1671):

at android.os.Handler.handleCallback(Handler.java:615) 01-24 11:41:46.470: E/AndroidRuntime(1671):

at android.os.Handler.dispatchMessage(Handler.java:92) 01-24 11:41:46.470: E/AndroidRuntime(1671):

at android.os.Looper.loop(Looper.java:137) 01-24 11:41:46.470: E/AndroidRuntime(1671):

at android.app.ActivityThread.main(ActivityThread.java:4745) 01-24 11:41:46.470: E/AndroidRuntime(1671):

at java.lang.reflect.Method.invokeNative(Native Method) 01-24 11:41:46.470: E/AndroidRuntime(1671):

at java.lang.reflect.Method.invoke(Method.java:511) 01-24 11:41:46.470: E/AndroidRuntime(1671):

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 01-24 11:41:46.470: E/AndroidRuntime(1671):

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 01-24 11:41:46.470: E/AndroidRuntime(1671):

at dalvik.system.NativeStart.main(Native Method)


Aucun commentaire:

Enregistrer un commentaire