【问题标题】:Record audio and java.lang.NullPointerException error录制音频和 java.lang.NullPointerException 错误
【发布时间】:2015-08-25 10:17:25
【问题描述】:

我正在开发一个应用程序,每当您单击开始录制按钮来录制我的音频时,当我单击停止录制按钮时,音频录制就会停止并将其保存在 sdcard,myFolder 当我单击开始录制时,出现 java.lang.NullPointerException 错误,应用程序意外停止。我该如何解决? 请帮助我,我是一个新的安卓开发者。

public class MainActivity extends AppCompatActivity {
        protected static final int request = 0;

        Intent intent;
        private MediaRecorder myRecorder;
        Button btnStopRecord;
        Button btnStarRecord;
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final File dir = new File(Environment.getExternalStorageDirectory() + "/myFolder");
        dir.mkdirs();
        myRecorder = new MediaRecorder();
        myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        btnStarRecord = (Button) findViewById(R.id.StartRecording);
        btnStarRecord.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final Date date = new Date();
                final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
                myRecorder.setOutputFile(Environment.getExternalStorageDirectory() + "/myFolder" + "/" + dateFormat.format(date) + ".amr");
                start(v);
            }
        });
        btnStopRecord = (Button) findViewById(R.id.stopRecording);
        btnStopRecord.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stop(v);
            }


        });
    }
private void stop(View v) {
        try {
            myRecorder.stop();
            myRecorder.release();
            myRecorder = null;

            btnStopRecord.setEnabled(false);
            btnStarRecord.setEnabled(true);

            Toast.makeText(getApplicationContext(), "Stop recording...",
                    Toast.LENGTH_SHORT).show();
        } catch (IllegalStateException e) {
            //  it is called before start()
            e.printStackTrace();
        } catch (RuntimeException e) {
            // no valid audio/video data has been received
            e.printStackTrace();
        }

    }


    private void start(View view) {
        try {
            myRecorder.prepare();
            myRecorder.start();

        } catch (IllegalStateException e) {
            // start:it is called before prepare()
            // prepare: it is called after start() or before setOutputFormat()
            e.printStackTrace();
        } catch (IOException e) {
            // prepare() fails
            e.printStackTrace();
        }}

08-25 13:59:54.036 21607-21607/com.example.mehrdad.myapplication E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NullPointerException 在 com.example.mehrdad.myapplication.MainActivity$4.onClick(MainActivity.java:165) 在 android.view.View.performClick(View.java:2408) 在 android.view.View$PerformClick.run(View.java:8816) 在 android.os.Handler.handleCallback(Handler.java:587) 在 android.os.Handler.dispatchMessage(Handler.java:92) 在 android.os.Looper.loop(Looper.java:123) 在 android.app.ActivityThread.main(ActivityThread.java:4633) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:521) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 在 dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 发布您的堆栈跟踪..
  • 发布完整的堆栈跟踪
  • @Vishwa ........
  • @PedroOliveira .... 请帮帮我

标签: java android audio audio-recording mediarecorder


【解决方案1】:

当您调用 stop 时,您将记录器设置为 null

myRecorder = null;

然后,如果您再次调用“start”,则假设您的 myRecorder 已实例化,但事实并非如此。

我的建议是在需要开始录制时重新创建对象

编辑

创建一个方法
    myRecorder = new MediaRecorder();
    myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);

在你再次调用 start 之前调用它

【讨论】:

    【解决方案2】:

    将 myRecorder 初始化移动到 onClick 方法中。

    btnStarRecord.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final Date date = new Date();
                final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
    
                myRecorder = new MediaRecorder();
                myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
    
                myRecorder.setOutputFile(Environment.getExternalStorageDirectory() + "/myFolder" + "/" + dateFormat.format(date) + ".amr");
                start(v);
            }
        });
    

    【讨论】:

    • 它在 onCreat 方法中。
    • 在 onCreate 方法中移除。将其保留在 onClick 方法中。佩德罗已经给你完整的解释了。
    【解决方案3】:

    从 onCreateView 中删除代码并检查此链接并更新权限。您不需要 myRecorder =null;停止录制。

    public void startRecording(){
                final Date date = new Date();
                final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
                myRecorder = new MediaRecorder();
                myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
                myRecorder.setOutputFile(Environment.getExternalStorageDirectory() + "/myFolder" + "/" + dateFormat.format(date) + ".amr");
                try {
            myRecorder.prepare();
            myRecorder.start();
    
        } catch (IllegalStateException e) {
            // start:it is called before prepare()
            // prepare: it is called after start() or before setOutputFormat()
            e.printStackTrace();
        } catch (IOException e) {
            // prepare() fails
            e.printStackTrace();
        }
    
        }
    

    【讨论】:

      猜你喜欢
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 2011-08-07
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多