java - 从子类访问方法时出错

标签 java android class subclass

我是 android 开发的新手,我想制作一个录音机,当我想从我的主要 Activity 访问开始录音的方法时,它总是会出错。下面是我的代码。我希望你能帮助我:

这是主要 Activity :

public class MainActivity extends AppCompatActivity {

Boolean isRecording = false;
Record record;

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

    record = new Record();
}

public void recordAudio(View view){
    if(!isRecording)
    {
        isRecording = true;
        record.startRecording();
    }

    else{
        isRecording = false;
        record.stopRecording();
    }
}

下面是子类:

public class Record extends MainActivity {

public void startRecording() {
    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
            RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, getBufferSize());

    int i = recorder.getState();
    if (i == 1)
        recorder.startRecording();

    isRecording = true;

    recordingThread = new Thread(new Runnable() {

        @Override
        public void run() {
            writeAudioDataToFile();
        }
    }, "AudioRecorder Thread");

    recordingThread.start();
    buttonRecord.setText(R.string.button_stop_record);

}

感谢您的帮助!

具体错误代码如下:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com, PID: 31778
              java.lang.IllegalStateException: Could not execute method for android:onClick
                  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
                  at android.view.View.performClick(View.java:6199)
                  at android.widget.TextView.performClick(TextView.java:11090)
                  at android.view.View$PerformClick.run(View.java:23647)
                  at android.os.Handler.handleCallback(Handler.java:751)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6682)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
               Caused by: java.lang.reflect.InvocationTargetException
                  at java.lang.reflect.Method.invoke(Native Method)
                  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                  at android.view.View.performClick(View.java:6199) 
                  at android.widget.TextView.performClick(TextView.java:11090) 
                  at android.view.View$PerformClick.run(View.java:23647) 
                  at android.os.Handler.handleCallback(Handler.java:751) 
                  at android.os.Handler.dispatchMessage(Handler.java:95) 
                  at android.os.Looper.loop(Looper.java:154) 
                  at android.app.ActivityThread.main(ActivityThread.java:6682) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 
               Caused by: java.lang.IllegalArgumentException: Invalid audio buffer size.
                  at android.media.AudioRecord.audioBuffSizeCheck(AudioRecord.java:751)
                  at android.media.AudioRecord.<init>(AudioRecord.java:385)
                  at android.media.AudioRecord.<init>(AudioRecord.java:289)
                  at com.Record.startRecording(Record.java:63)
                  at com.MainActivity.recordAudio(MainActivity.java:35)
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                  at android.view.View.performClick(View.java:6199) 
                  at android.widget.TextView.performClick(TextView.java:11090) 
                  at android.view.View$PerformClick.run(View.java:23647) 
                  at android.os.Handler.handleCallback(Handler.java:751) 
                  at android.os.Handler.dispatchMessage(Handler.java:95) 
                  at android.os.Looper.loop(Looper.java:154) 
                  at android.app.ActivityThread.main(ActivityThread.java:6682) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 

最佳答案

在 Android 中,Activity 通常由用户代码启动,但对象创建不是用户的责任,而是由 Android 框架来完成。

您的案例有 Record extends MainActivity 并且 MainActivity 是一个 Activity 使得 Record 也是一个 Activity。因此,您需要启动它,使其成为 list 文件中的启动器主要 Activity 或使用 startActivity()(或 startActivityForResult())。

代码 record = new Record(); 在这里,您自己在父类 MainActivity 中创建了 Record 的实例。从 Android 编程和 Java 面向对象的角度来看,这都不是一个好主意。 (因此你可以但不应该选择这样做)

引用另一个帖子的一个答案 https://stackoverflow.com/a/14956056/504133

我建议您使用两个或三个 Activity 制作简单的 Android 应用程序,每个 Activity 都有简单的 UI 布局。您可以在那里学习,然后将概念应用于更复杂的应用程序,例如 AudioRecorder。

关于java - 从子类访问方法时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49464971/

相关文章:

java - 如何使用 Servlet 和 JSP 创建聊天应用程序

java - 嵌入式 Jetty 是否能够设置过滤器的初始参数?

java - 从 ListView 项读取音频文件

c++ - 在 Android 发送的图像上计算服务器端的 OpenCV 函数

java - 在寻找最近的位置时,我怎样才能比蛮力做得更好?

c++ - 对象列表中的变量不会改变

java - 蒙特卡罗标准差方程

安卓 adb : No connection could be made because the target machine actively refused it

Python:当旧对象与新对象相等时复制对象

c++ - 带/不带虚拟的纯虚拟方法的实现?