android - 尝试在空对象引用上调用虚拟方法“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);
解决方案
您缺少的运行时权限,Manifest.permission.RECORD_AUDIO
请将其添加到您的清单文件中。
<uses-permission android:name="android.permission.RECORD_AUDIO" />
您需要检查该权限运行时并继续进行。
推荐阅读
- scala - 如何从 Scala 的配置中传递持续时间变量?
- python - 如何在pygame中调试?
- angular - 解析器获取数据后角度路由器无法导航
- python - 在记忆游戏中销毁按钮 - Python Tkinter
- javascript - 对此作出反应。不是函数
- android - 如何将 Activity(rootview,其他)放到 SurfaceTexture
- mongodb - 在本地设置 mongo 数据库
- javascript - Instanceof 'Class' 使用模拟对象返回 false
- bash - 在执行删除操作之前报告将被删除的文件 - bash
- node.js - 电报 - 出现 AUTH_KEY_UNREGISTERED 和 API_ID_INVALID 错误