質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1010閲覧

録音と再生を行うアンドロイドアプリの起動で出るエラーjava.lang.NullPointerExceptionの解決

Yoridesu

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2021/12/19 14:10

前提・実現したいこと

Android studioを使ってアプリを作成しています。
音をwavファイルとして保存し、そのファイルを再生したいのですが、アプリそのものが起動できません。Run部分に表示されるエラーを解決したいです。

発生している問題・エラーメッセージ

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.websarva.wings.android.test_app, PID: 9036
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.websarva.wings.android.test_app/com.websarva.wings.android.test_app.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.RandomAccessFile.seek(long)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.RandomAccessFile.seek(long)' on a null object reference
at com.websarva.wings.android.test_app.WaveFile.createFile(WaveFile.java:51)
at com.websarva.wings.android.test_app.MainActivity.onCreate(MainActivity.java:45)
at android.app.Activity.performCreate(Activity.java:6975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
at android.app.ActivityThread.-wrap11(Unknown Source:0) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
at android.os.Handler.dispatchMessage(Handler.java:105) 
at android.os.Looper.loop(Looper.java:164) 
at android.app.ActivityThread.main(ActivityThread.java:6541) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

該当のソースコード

__MainActivityファイル

public class MainActivity extends AppCompatActivity {

private AudioRecord _record; private AudioTrack _track; private WaveFile wav1 = new WaveFile(); final static int SAMPLING_RATE = 44100; private int bufSize; private short[] shortData; private MediaPlayer _player; private Button _btRec; private Button _btPuase; private Button _btPlay; private Button _btStop; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); _btRec = findViewById(R.id.rec); _btPuase = findViewById(R.id.pause); _btPlay = findViewById(R.id.play); _btStop = findViewById(R.id.stop); _player = new MediaPlayer(); //今は消しとくinitAudioRecord(); wav1.createFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/voice.wav"); Listener listener = new Listener(); _btRec.setOnClickListener(listener); } public class Listener implements View.OnClickListener { @Override public void onClick(View view) { int id = view.getId(); switch (id) { case R.id.rec: _record.startRecording(); _record.read(shortData, 0, bufSize / 2); break; case R.id.pause: _record.stop(); initMediaPlayer(); } } } private void initMediaPlayer() { _player = new MediaPlayer(); try { _player.setDataSource(Environment.getExternalStorageDirectory().getAbsolutePath() + "/voice.wav"); } catch (IOException e) { e.printStackTrace(); } try { _player.prepare(); } catch (IOException e) { e.printStackTrace(); } } public void onPause(){ super.onPause(); wav1.close(); } public void onDestroy(){ super.onDestroy(); _record.release(); }

}

___wavファイル

public class WaveFile {

private final int FILESIZE_SEEK = 4; private final int DATASIZE_SEEK = 40; private RandomAccessFile raf; private File recFile; private String fileName; private byte[] RIFF = {'R', 'I', 'F', 'F'}; private int fileSize = 36; private byte[] WAVE = {'W', 'A', 'V', 'E'}; private byte[] fmt = {'f', 'm', 't', ' '}; private int fmtSize = 16; private byte[] fmtID = {1, 0}; // 2byte private short chCount = 1; private int sampleRate = 44100; private int bytePerSec = 44100 * 2; private short blockSize = 2; private short bitPerSample = 16; private byte[] data = {'d', 'a', 't', 'a'}; private int dataSize = 0; public void createFile(String fName) { fileName = fName; recFile = new File(fileName); if (recFile.exists()) { recFile.delete(); } try { recFile.createNewFile(); } catch (IOException e) { // TODO Auto-generated catch block
 e.printStackTrace(); } try { raf = new RandomAccessFile(recFile, "rw"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block
 e.printStackTrace(); } try { raf.seek(0); //ここの参照がおかしいらしい raf.write(RIFF); raf.write(littleEndianInteger(fileSize)); raf.write(WAVE); raf.write(fmt); raf.write(littleEndianInteger(fmtSize)); raf.write(fmtID); raf.write(littleEndianShort(chCount)); raf.write(littleEndianInteger(sampleRate)); raf.write(littleEndianInteger(bytePerSec)); raf.write(littleEndianShort(blockSize)); raf.write(littleEndianShort(bitPerSample)); raf.write(data); raf.write(littleEndianInteger(dataSize)); } catch (IOException e) { // TODO Auto-generated catch block
 e.printStackTrace(); } } private byte[] littleEndianInteger(int i){ byte[] buffer = new byte[4]; buffer[0] = (byte) i; buffer[1] = (byte) (i >> 8); buffer[2] = (byte) (i >> 16); buffer[3] = (byte) (i >> 24); return buffer; } public void addBigEndianData(short[] shortData) { try { raf.seek(raf.length()); raf.write(littleEndianShorts(shortData)); } catch (IOException e) { // TODO Auto-generated catch block
 e.printStackTrace(); } updateFileSize(); updateDataSize(); } private void updateFileSize(){ fileSize = (int) (recFile.length() - 8); byte[] fileSizeBytes = littleEndianInteger(fileSize); try { raf.seek(FILESIZE_SEEK); raf.write(fileSizeBytes); } catch (IOException e) { // TODO Auto-generated catch block
 e.printStackTrace(); } } private void updateDataSize(){ dataSize = (int) (recFile.length() - 44); byte[] dataSizeBytes = littleEndianInteger(dataSize); try { raf.seek(DATASIZE_SEEK); raf.write(dataSizeBytes); } catch (IOException e) { // TODO Auto-generated catch block
 e.printStackTrace(); } } private byte[] littleEndianShort(short s){ byte[] buffer = new byte[2]; buffer[0] = (byte) s; buffer[1] = (byte) (s >> 8); return buffer; } private byte[] littleEndianShorts(short[] s){ byte[] buffer = new byte[s.length * 2]; int i; for(i = 0; i < s.length; i++){ buffer[2 * i] = (byte) s[i]; buffer[2 * i + 1] = (byte) (s[i] >> 8); } return buffer; } void close(){ //public try { raf.close(); } catch (IOException e) { // TODO Auto-generated catch block
 e.printStackTrace(); } }

}

試したこと

エラー部分を検索し、どう直せば良いのか検討してはみたが、直すべきことが分からず、質問させていただきました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/12/19 14:16

コードやエラーメッセージ等はそれぞれ毎・ファイル毎にマークダウン記法を用いてご提示ください。 マークダウンにつきましてはヘルプをご参照ください。
jimbe

2021/12/19 14:23

> raf.seek(0); //ここの参照がおかしいらしい 該当箇所より前にある raf = new RandomAccessFile(recFile, "rw"); や recFile.createNewFile(); で例外を無視しており、現在発生している例外はだけでは情報が不足しています。 それぞれで例外発生時には何が起きたのかを出力した上で適切に処理を中止するようにして、再度情報を収集・ご提示ください。
1T2R3M4

2021/12/19 14:24 編集

調べたこと、試したことを具体的に 質問に追記していただけませんか。 具体的に書けないのならばなにも試していないのでしょう。
jimbe

2021/12/19 14:25

また、android は内部ファイルの操作に関しましてはバージョン等によって利用の制限やパーミッションの設定等が変化しています。 開発に使用している Android API のバージョンやテスト環境・エミュレータの各種バージョン等もご提示頂く必要があるかと思います。
Yoridesu

2021/12/19 14:57

1T2R3M4様 仰る通りです、実際には試すべきことも検討できず、何もできておりません。
Yoridesu

2021/12/19 14:59

jimbe様 丁寧にご指摘下さりありがとうございます。 例外通知等、情報を揃えて質問を変更したいと思います。
hoshi-takanori

2021/12/19 15:14

各 TODO コメントの e.printStackTrace(); の前に LSEP とかいう謎の制御文字が入ってますが、もしかして改行したつもりでしょうか? ちゃんと改行すれば何かしらエラーは表示されるはず…。 で、Environment.getExternalStorageDirectory() が問題になる可能性が高いので、とりあえず自分のアプリから読み書きできればいいなら getFilesDir() に変更してみては。 https://qiita.com/mgmgmogumi/items/fa2bba333899e39e4ac3
Yoridesu

2021/12/22 09:26

hoshi-takanori様 使い方を調べてgetFileDir()を使用したところ、上記したエラーが解決されました! ありがとうございました。
guest

回答1

0

ベストアンサー

そのエラーは、nullが入ってる変数で何やかや操作しようとするときに出るエラーです
まずは、そのエラーが出る場所に登場してる変数のナカミを片っ端からチェックしてみてはどうでしょう

投稿2021/12/19 22:52

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問