質問編集履歴

2

ソース、エラーの内容が変わりました。

2015/07/28 14:09

投稿

soccerkozo
soccerkozo

スコア12

test CHANGED
@@ -1 +1 @@
1
- androidアプリ録音したのもをwavファイルで保存する nullpointerexceptionが起きる理由が分からないです。
1
+ androidアプリ録音したのもをwavファイルで保存する ファイル間の受け渡し
test CHANGED
@@ -1,114 +1,104 @@
1
+ - 0. ```> ここに言語を入力
2
+
3
+ リスト
4
+
1
- 録音したものをwavファイルで保存するandroidアプリを開発しています。
5
+ ```録音したものをwavファイルで保存するandroidアプリを開発しています。
2
-
6
+
3
- 度書き換えてNullPrinterExceptionのエラーが発生し
7
+ ファイルは作られるのですが、中に何も入っていせん
4
8
 
5
9
  理由の分かる方いらっしゃいましたらよろしくお願いします。
6
10
 
7
- 端末はnexus7を使っています。
11
+
8
-
9
-
10
-
12
+
11
- 以下ソーーーーーーーーーーーーーーーーー
13
+ ーーーーーーーーーーーーーーーーーー
12
-
13
-
14
-
15
- import java.io.File;
14
+
16
-
17
- import java.io.FileInputStream;
18
-
19
- import java.io.FileNotFoundException;
20
-
21
- import java.io.FileOutputStream;
22
-
23
- import java.io.IOException;
24
-
25
- import java.io.OutputStream;
26
-
27
-
28
-
29
- import android.media.AudioFormat;
30
-
31
- import android.media.AudioRecord;
32
-
33
- import android.media.MediaRecorder;
34
-
35
- import android.os.Bundle;
36
-
37
- import android.os.Environment;
38
-
39
- import android.app.Activity;
40
-
41
- import android.view.Menu;
42
-
43
- import android.view.View;
44
-
45
- import android.view.View.OnClickListener;
46
-
47
- import android.widget.Button;
48
-
49
-
50
-
51
- public class MainActivity extends Activity implements OnClickListener {
15
+ public class MainActivity extends Activity {
16
+
52
-
17
+ private static final int RECORDER_BPP = 16;
18
+
53
-
19
+ private static final String AUDIO_RECORDER_FILE_EXT_WAV = ".wav";
20
+
54
-
21
+ //private static final String AUDIO_RECORDER_FOLDER = "/DCIM/AudioRecorder";
22
+
23
+ private static final String AUDIO_RECORDER_TEMP_FILE = "record_temp.raw";
24
+
25
+ private static final int RECORDER_SAMPLERATE = 44100;
26
+
27
+ private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
28
+
29
+ private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
30
+
31
+
32
+
55
- private AudioRecord AR = null;
33
+ private AudioRecord recorder = null;
56
-
57
- private byte data[];
34
+
58
-
59
- private int bufsize;
35
+ private int bufferSize = 0;
60
-
61
- private static final String ARFE = ".wav";
62
-
63
- private static final String tmpfile = "record_temp.raw";
64
-
65
- OutputStream ops = null;
66
-
67
- String filename;
68
-
69
- private boolean IR = false;
70
36
 
71
37
  private Thread recordingThread = null;
72
38
 
73
-
39
+ private boolean isRecording = false;
74
-
75
-
76
-
40
+
41
+
42
+
77
- @Override
43
+ @Override
78
-
44
+
79
- protected void onCreate(Bundle savedInstanceState) {
45
+ public void onCreate(Bundle savedInstanceState) {
80
-
46
+
81
- super.onCreate(savedInstanceState);
47
+ super.onCreate(savedInstanceState);
82
-
48
+
83
- setContentView(R.layout.activity_main);
49
+ setContentView(R.layout.activity_main);
50
+
51
+
52
+
84
-
53
+ setButtonHandlers();
85
-
86
-
54
+
87
- enableButtons(false);
55
+ enableButtons(false);
88
-
89
-
90
-
56
+
57
+
58
+
91
- Button BSta = (Button)findViewById(R.id.button1);
59
+ bufferSize = AudioRecord.getMinBufferSize(8000,
92
-
60
+
93
- Button BSto = (Button)findViewById(R.id.button2);
61
+ AudioFormat.CHANNEL_CONFIGURATION_MONO,
94
-
95
-
96
-
97
- BSta.setOnClickListener(this);
62
+
98
-
99
- BSto.setOnClickListener(this);
63
+ AudioFormat.ENCODING_PCM_16BIT);
100
-
101
-
102
-
64
+
103
- }
65
+ }
66
+
67
+
68
+
104
-
69
+ private void setButtonHandlers() {
70
+
105
-
71
+ ((Button)findViewById(R.id.btnStart)).setOnClickListener(btnClick);
72
+
106
-
73
+ ((Button)findViewById(R.id.btnStop)).setOnClickListener(btnClick);
74
+
75
+ }
76
+
77
+
78
+
79
+ private void enableButton(int id,boolean isEnable){
80
+
81
+ ((Button)findViewById(id)).setEnabled(isEnable);
82
+
83
+ }
84
+
85
+
86
+
87
+ private void enableButtons(boolean isRecording) {
88
+
89
+ enableButton(R.id.btnStart,!isRecording);
90
+
91
+ enableButton(R.id.btnStop,isRecording);
92
+
93
+ }
94
+
95
+
96
+
107
- private String getFilename(){
97
+ private String getFilename(){
108
98
 
109
99
  String filepath = Environment.getExternalStorageDirectory().getPath();
110
100
 
111
- File file = new File(filepath,System.currentTimeMillis() + ARFE);
101
+ File file = new File(filepath,System.currentTimeMillis() + AUDIO_RECORDER_FILE_EXT_WAV/*AUDIO_RECORDER_FOLDER*/);
112
102
 
113
103
 
114
104
 
@@ -118,71 +108,123 @@
118
108
 
119
109
  }
120
110
 
121
-
122
-
111
+
112
+
123
- return(filepath+"/"+System.currentTimeMillis() + ARFE);
113
+ return (filepath + "/" + System.currentTimeMillis() + AUDIO_RECORDER_FILE_EXT_WAV);
124
-
114
+
125
- }
115
+ }
126
-
127
-
128
-
116
+
117
+
118
+
129
- private String getTempFilename(){
119
+ private String getTempFilename(){
130
120
 
131
121
  String filepath = Environment.getExternalStorageDirectory().getPath();
132
122
 
123
+ File file = new File(filepath,System.currentTimeMillis() + AUDIO_RECORDER_FILE_EXT_WAV/*AUDIO_RECORDER_FOLDER*/);
124
+
125
+
126
+
127
+ if(!file.exists()){
128
+
129
+ file.mkdirs();
130
+
131
+ }
132
+
133
+
134
+
133
- File tempFile = new File(filepath,tmpfile);
135
+ File tempFile = new File(filepath,AUDIO_RECORDER_TEMP_FILE);
134
-
135
-
136
-
136
+
137
+
138
+
137
- if(tempFile.exists()){
139
+ if(tempFile.exists())
138
140
 
139
141
  tempFile.delete();
140
142
 
141
- }
142
-
143
-
144
-
145
- return (filepath+"/"+tmpfile);
146
-
147
- }
148
-
149
-
150
-
151
- private void writeAudioDataToFile(){
152
-
153
-
154
-
155
- final int FREQUENCY = 8000;
156
-
157
- bufsize =android.media.AudioRecord.getMinBufferSize(FREQUENCY, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
158
-
159
- AR =new AudioRecord(MediaRecorder.AudioSource.MIC,FREQUENCY,AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT,bufsize);
160
-
161
-
162
-
163
- try{
164
-
165
- ops = openFileOutput(filename,MODE_APPEND);
166
-
167
- }catch(FileNotFoundException e){
168
-
169
- e.printStackTrace();
170
-
171
- }
172
-
173
-
174
-
175
- int read = 0;
176
-
177
- data = new byte[bufsize];
178
-
179
-
180
-
181
- if(null != ops){
182
-
183
- while(IR){
184
-
185
- read = AR.read(data, 0, bufsize);
143
+
144
+
145
+ return (filepath + "/" + AUDIO_RECORDER_TEMP_FILE);
146
+
147
+ }
148
+
149
+
150
+
151
+ private void startRecording(){
152
+
153
+ recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
154
+
155
+ RECORDER_SAMPLERATE, RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING, bufferSize);
156
+
157
+
158
+
159
+ int i = recorder.getState();
160
+
161
+ if(i==1)
162
+
163
+ recorder.startRecording();
164
+
165
+
166
+
167
+ isRecording = true;
168
+
169
+
170
+
171
+ recordingThread = new Thread(new Runnable() {
172
+
173
+
174
+
175
+ @Override
176
+
177
+ public void run() {
178
+
179
+ writeAudioDataToFile();
180
+
181
+ }
182
+
183
+ },"AudioRecorder Thread");
184
+
185
+
186
+
187
+ recordingThread.start();
188
+
189
+
190
+
191
+ }
192
+
193
+
194
+
195
+ private void writeAudioDataToFile(){
196
+
197
+ byte data[] = new byte[bufferSize];
198
+
199
+ String filename = getTempFilename();
200
+
201
+ FileOutputStream os = null;
202
+
203
+
204
+
205
+ try {
206
+
207
+ os = new FileOutputStream(filename);
208
+
209
+ } catch (FileNotFoundException e) {
210
+
211
+ // TODO Auto-generated catch block
212
+
213
+ e.printStackTrace();
214
+
215
+ }
216
+
217
+
218
+
219
+ int read = 0;
220
+
221
+
222
+
223
+ if(null != os){
224
+
225
+ while(isRecording){
226
+
227
+ read = recorder.read(data, 0, bufferSize);
186
228
 
187
229
 
188
230
 
@@ -190,7 +232,7 @@
190
232
 
191
233
  try {
192
234
 
193
- ops.write(data);
235
+ os.write(data);
194
236
 
195
237
  } catch (IOException e) {
196
238
 
@@ -206,7 +248,7 @@
206
248
 
207
249
  try {
208
250
 
209
- ops.close();
251
+ os.close();
210
252
 
211
253
  } catch (IOException e) {
212
254
 
@@ -216,13 +258,47 @@
216
258
 
217
259
  }
218
260
 
219
-
220
-
221
- }
261
+ }
262
+
263
+
264
+
222
-
265
+ private void stopRecording(){
266
+
223
-
267
+ if(null != recorder){
268
+
269
+
270
+
224
-
271
+ isRecording = false;
272
+
273
+
274
+
275
+ int i = recorder.getState();
276
+
277
+ if(i==1)
278
+
279
+ recorder.stop();
280
+
281
+ recorder.release();
282
+
283
+
284
+
285
+ recorder = null;
286
+
287
+ recordingThread = null;
288
+
289
+ }
290
+
291
+
292
+
293
+ copyWaveFile(getTempFilename(),getFilename());
294
+
295
+ deleteTempFile();
296
+
297
+ }
298
+
299
+
300
+
225
- private void deleteTempFile() {
301
+ private void deleteTempFile() {
226
302
 
227
303
  File file = new File(getTempFilename());
228
304
 
@@ -232,9 +308,9 @@
232
308
 
233
309
  }
234
310
 
235
-
236
-
311
+
312
+
237
- private void copyWaveFile(String inFilename,String outFilename){
313
+ private void copyWaveFile(String inFilename,String outFilename){
238
314
 
239
315
  FileInputStream in = null;
240
316
 
@@ -244,15 +320,15 @@
244
320
 
245
321
  long totalDataLen = totalAudioLen + 36;
246
322
 
247
- long longSampleRate = 8000;
323
+ long longSampleRate = RECORDER_SAMPLERATE;
248
324
 
249
325
  int channels = 2;
250
326
 
251
- long byteRate = 16*8000*2/8;
327
+ long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels/8;
252
-
253
-
254
-
328
+
329
+
330
+
255
- byte[] data = new byte[bufsize];
331
+ byte[] data = new byte[bufferSize];
256
332
 
257
333
 
258
334
 
@@ -268,7 +344,9 @@
268
344
 
269
345
 
270
346
 
271
- WriteWaveFileHeader(out, totalAudioLen, totalDataLen,longSampleRate, channels, byteRate);
347
+ WriteWaveFileHeader(out, totalAudioLen, totalDataLen,
348
+
349
+ longSampleRate, channels, byteRate);
272
350
 
273
351
 
274
352
 
@@ -296,25 +374,15 @@
296
374
 
297
375
  }
298
376
 
299
-
300
-
301
- private void enableButton(int id,boolean isEnable){
377
+
302
-
303
- ((Button)findViewById(id)).setEnabled(isEnable);
378
+
304
-
305
- }
306
-
307
-
308
-
309
- private void enableButtons(boolean IR) {
379
+ private void WriteWaveFileHeader(
310
-
380
+
311
- enableButton(R.id.button1,!IR);
381
+ FileOutputStream out, long totalAudioLen,
382
+
312
-
383
+ long totalDataLen, long longSampleRate, int channels,
384
+
313
- enableButton(R.id.button2,IR);
385
+ long byteRate) throws IOException {
314
-
315
- }
316
-
317
- private void WriteWaveFileHeader(FileOutputStream out, long totalAudioLen,long totalDataLen, long longSampleRate, int channels,long byteRate) throws IOException {
318
386
 
319
387
 
320
388
 
@@ -390,7 +458,7 @@
390
458
 
391
459
  header[33] = 0;
392
460
 
393
- header[34] = 16;
461
+ header[34] = RECORDER_BPP; // bits per sample
394
462
 
395
463
  header[35] = 0;
396
464
 
@@ -418,130 +486,86 @@
418
486
 
419
487
 
420
488
 
421
-
489
+ private View.OnClickListener btnClick = new View.OnClickListener() {
422
-
490
+
423
- @Override
491
+ @Override
424
-
425
- public boolean onCreateOptionsMenu(Menu menu) {
492
+
426
-
427
- // Inflate the menu; this adds items to the action bar if it is present.
428
-
429
- getMenuInflater().inflate(R.menu.main, menu);
430
-
431
- return true;
432
-
433
- }
434
-
435
-
436
-
437
- @Override
438
-
439
- public void onClick(View v) {
493
+ public void onClick(View v) {
440
-
441
- // TODO 自動生成されたメソッド・スタブ
494
+
442
-
443
- switch(v.getId()){
495
+ switch(v.getId()){
444
-
496
+
445
- case R.id.button1:{
497
+ case R.id.btnStart:{
446
-
447
-
448
-
498
+
499
+
500
+
449
- enableButtons(true);
501
+ enableButtons(true);
450
-
451
-
452
-
453
- int i = AR.getState();
502
+
454
-
455
- if(i==1){
456
-
457
- AR.startRecording();
503
+ startRecording();
458
-
459
- IR = true;
504
+
460
-
461
- recordingThread = new Thread(new Runnable() {
505
+
462
-
463
-
464
-
465
- @Override
506
+
466
-
467
- public void run() {
468
-
469
- writeAudioDataToFile();
470
-
471
- }
472
-
473
- },"AudioRecorder Thread");
474
-
475
-
476
-
477
- recordingThread.start();
478
-
479
-
480
-
481
- break;
507
+ break;
482
-
483
- }
484
-
485
- }
486
-
487
- case R.id.button2:{
488
-
489
- enableButtons(false);
490
-
491
- if(AR != null){
492
-
493
-
494
-
495
- IR = false;
496
-
497
- int i = AR.getState();
498
-
499
-
500
-
501
- if(i==1){
502
-
503
- AR.stop();
504
-
505
- AR.release();
506
-
507
-
508
-
509
- AR = null;
510
-
511
- recordingThread = null;
512
508
 
513
509
  }
514
510
 
515
-
511
+ case R.id.btnStop:{
516
-
512
+
513
+
514
+
515
+
516
+
517
- copyWaveFile(getTempFilename(),getFilename());
517
+ enableButtons(false);
518
-
518
+
519
- deleteTempFile();
519
+ stopRecording();
520
+
521
+
522
+
520
-
523
+ break;
521
-
522
-
524
+
523
- }
525
+ }
524
-
525
- break;
526
+
526
-
527
- }
528
-
529
- }
530
-
531
- }
532
-
533
-
534
-
535
- }
536
-
537
-
538
-
539
- ---------追加したpermission--------------
527
+ ---------エラー------------
528
+
540
-
529
+ : E/AudioRecord-JNI(10620): Error creating AudioRecord instance: initialization check failed.
530
+
531
+ : E/AudioRecord-Java(10620): [ android.media.AudioRecord ] Error code -20 when initializing native AudioRecord object.
532
+
533
+ : W/System.err(10620): java.io.FileNotFoundException: /storage/sdcard0/record_temp.raw: open failed: ENOENT (No such file or directory)
534
+
535
+ : W/System.err(10620): at libcore.io.IoBridge.open(IoBridge.java:416)
536
+
537
+ : W/System.err(10620): at java.io.FileInputStream.<init>(FileInputStream.java:78)
538
+
539
+ : W/System.err(10620): at java.io.FileInputStream.<init>(FileInputStream.java:105)
540
+
541
+ : W/System.err(10620): at com.example.s3033051.jissen2samp1.MainActivity.copyWaveFile(MainActivity.java:178)
542
+
543
+ : W/System.err(10620): at com.example.s3033051.jissen2samp1.MainActivity.stopRecording(MainActivity.java:156)
544
+
545
+ : W/System.err(10620): at com.example.s3033051.jissen2samp1.MainActivity.access$2(MainActivity.java:142)
546
+
547
+ : W/System.err(10620): at com.example.s3033051.jissen2samp1.MainActivity$1.onClick(MainActivity.java:269)
548
+
549
+ : W/System.err(10620): at android.view.View.performClick(View.java:4204)
550
+
551
+ : W/System.err(10620): at android.view.View$PerformClick.run(View.java:17355)
552
+
553
+ : W/System.err(10620): at android.os.Handler.handleCallback(Handler.java:725)
554
+
555
+ : W/System.err(10620): at android.os.Handler.dispatchMessage(Handler.java:92)
556
+
557
+ : W/System.err(10620): at android.app.ActivityThread.main(ActivityThread.java:5292)
558
+
559
+ : W/System.err(10620): at java.lang.reflect.Method.invoke(Method.java:511)
560
+
561
+ : W/System.err(10620): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1031)
562
+
541
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
563
+ : W/System.err(10620): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:798)
564
+
542
-
565
+ : W/System.err(10620): at dalvik.system.NativeStart.main(Native Method)
566
+
543
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
567
+ : W/System.err(10620): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
544
-
568
+
545
- <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
569
+ : W/System.err(10620): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
546
-
570
+
547
- <uses-permission android:name="permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
571
+ : W/System.err(10620): at libcore.io.IoBridge.open(IoBridge.java:400)

1

開発端末を書いておきます。

2015/07/28 14:09

投稿

soccerkozo
soccerkozo

スコア12

test CHANGED
File without changes
test CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  理由の分かる方いらっしゃいましたらよろしくお願いします。
6
6
 
7
+ 端末はnexus7を使っています。
8
+
7
9
 
8
10
 
9
11
  以下ソースーーーーーーーーーーーーーーーーーー