首页 > 解决方案 > 尝试在空对象引用上调用虚拟方法“void android.media.MediaRecorder.setAudioSource(int)”

问题描述

这是我的代码:

public class MainActivity extends AppCompatActivity {

Button btnrecord;
Button btnstop;
MediaRecorder recorder;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnrecord = findViewById(R.id.btnRecord);
    btnstop = findViewById(R.id.btnStop);

    btnrecord.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            recorder = new MediaRecorder();

            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
            recorder.setOutputFile(G.address + "/" + System.currentTimeMillis() + ".amr");

            try {
                recorder.prepare();
                recorder.start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });

    btnstop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            recorder.release();
        }
    });
}
}

当我运行它时,它会生成此错误:

attempt to invoke virtual method 'void android.media.MediaRecorder.setAudioSource(int)' on a null object reference

对于这一行:

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

我阅读了类似的问题并在网上搜索。那些关于初始化 MediaRecorder 但我已经初始化的地方recorder。所以我不知道我的代码的哪一部分null给了我这个错误。你能帮我么?

更新

我刚刚重新启动 Android Studio,之前的错误就消失了。现在显示此错误:

10-05 14:21:05.584 10855-10855/? E/Zygote: v2
10-05 14:21:05.584 10855-10855/? E/Zygote: accessInfo : 0
10-05 14:21:22.964 10855-10855/com.pentester.myregm.recorder E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.pentester.myregm.recorder, PID: 10855
java.lang.RuntimeException: setAudioSource failed.
    at android.media.MediaRecorder._setAudioSource(Native Method)
    at android.media.MediaRecorder.setAudioSource(MediaRecorder.java:488)
    at com.pentester.myregm.recorder.MainActivity$1.onClick(MainActivity.java:31)
    at android.view.View.performClick(View.java:5697)
    at android.widget.TextView.performClick(TextView.java:10826)
    at android.view.View$PerformClick.run(View.java:22526)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:158)
    at android.app.ActivityThread.main(ActivityThread.java:7224)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

它仍然适用于这一行:

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

标签: android

解决方案


您缺少的运行时权限Manifest.permission.RECORD_AUDIO请将其添加到您的清单文件中。

<uses-permission android:name="android.permission.RECORD_AUDIO" />

您需要检查该权限运行时并继续进行。


推荐阅读