java.lang.Исключение NullPointerException при ошибке создания файла

#android #file #fileoutputstream #mediarecorder

#Android #файл #fileoutputstream #mediarecorder

Вопрос:

Я пытаюсь сохранить выходной аудиофайл в отдельной новой папке, но когда я пытаюсь запустить приложение, оно выходит из строя :

Код моего создания файла выглядит следующим образом:

В onCreate() aof MainActivity:

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         play=(Button)findViewById(R.id.button3);
          stop=(Button)findViewById(R.id.button2);
          record=(Button)findViewById(R.id.button);


         stop.setEnabled(false);
          play.setEnabled(false);

          final File path =
                Environment.getExternalStoragePublicDirectory
                (
                    //Environment.DIRECTORY_PICTURES
                    //Environment.DIRECTORY_DCIM
                    Environment.DIRECTORY_DCIM   "/Utkarshrecord/"
                );

            // Make sure the sound directory exists.
            if(!path.exists())
            {
                path.mkdirs();
            }

           try {
               file.createTempFile("sound", ".3gp", path);

            myAudioRecorder=new MediaRecorder();
            myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            myAudioRecorder.setOutputFile(file.getAbsolutePath());

        } catch (IOException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
  

Есть три кнопки для остановки записи и воспроизведения:

код для записи:

 record.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                try {
                   myAudioRecorder.prepare();
                   myAudioRecorder.start();
                }

                catch (IllegalStateException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
                }

                catch (IOException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
                }

                record.setEnabled(false);
                stop.setEnabled(true);

                Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show();
             }
          });
  

код для остановки:

  stop.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) throws IllegalArgumentException,SecurityException,IllegalStateException {
                try{
                     myAudioRecorder.stop();
                    myAudioRecorder.release();
                    myAudioRecorder  = null;




                }catch(Exception e){
                    e.printStackTrace();
                }
                Toast.makeText(getApplicationContext(), "Audio recorded successfully",Toast.LENGTH_LONG).show();
                stop.setEnabled(false);
                play.setEnabled(true);
             }
          });
  

ошибка заключается в следующем:

 10-05 14:44:04.910: E/AndroidRuntime(31147): FATAL EXCEPTION: main
10-05 14:44:04.910: E/AndroidRuntime(31147): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sensorlist/com.example.sensorlist.MainActivity}: java.lang.NullPointerException
10-05 14:44:04.910: E/AndroidRuntime(31147):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2343)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2395)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at android.app.ActivityThread.access$600(ActivityThread.java:162)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at android.os.Handler.dispatchMessage(Handler.java:107)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at android.os.Looper.loop(Looper.java:194)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at android.app.ActivityThread.main(ActivityThread.java:5371)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at java.lang.reflect.Method.invokeNative(Native Method)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at java.lang.reflect.Method.invoke(Method.java:525)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at dalvik.system.NativeStart.main(Native Method)
10-05 14:44:04.910: E/AndroidRuntime(31147): Caused by: java.lang.NullPointerException
10-05 14:44:04.910: E/AndroidRuntime(31147):    at java.io.File.fixSlashes(File.java:185)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at java.io.File.<init>(File.java:134)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at java.io.FileOutputStream.<init>(FileOutputStream.java:128)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at java.io.FileOutputStream.<init>(FileOutputStream.java:117)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at com.example.sensorlist.MainActivity.onCreate(MainActivity.java:64)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at android.app.Activity.performCreate(Activity.java:5122)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081)
10-05 14:44:04.910: E/AndroidRuntime(31147):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
10-05 14:44:04.910: E/AndroidRuntime(31147):    ... 11 more
  

что я должен сделать, чтобы удалить его?

Комментарии:

1. то, что вы установили в outputFile, пожалуйста, укажите здесь.

2. Какая строка является строкой 64 в MainActivity.java ? и что вы назначили outputFile?

3. Я думаю, что проблема в другом месте, если у вас есть какие-либо фрагменты, которые прикреплены к действию, затем проверьте их onCreate() метод, в котором они, возможно, обращаются к нулевой ссылке на объект.

4. там null @kalpanac

5. Я использую fileoutputstream для создания папки @KaiMattern

Ответ №1:

Потому что есть некоторые ошибки, которые вы сделали, которые очень глупы!

Ошибка 1:

 file.createTempFile("sound", ".3gp", path);
  

Для static ссылки это должно быть

 File.createTempFile("sound", ".3gp", path);
  

и это должно быть сохранено в вашем файле, который есть null до сих пор!

2-я ошибка :

в кнопке воспроизведения: измените его на

  m.setDataSource(file.getAbsolutePath());
  

Комментарии:

1. спасибо @utkarshdubey