【问题标题】:Error when accessing method from subclass从子类访问方法时出错
【发布时间】:2018-03-24 12:59:20
【问题描述】:

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

这是mainActivity:

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) 

【问题讨论】:

  • 你能在你的问题中添加确切的错误吗?
  • 我将错误日志添加到我的问题中,感谢您的帮助
  • 你想达到什么目的? Activity里面的Activity?
  • 不,计划是从子类中访问代码,这些代码在主要活动中并不多,我有一个更好的概述

标签: java android class subclass


【解决方案1】:

在 Android 中,Activity 通常由用户代码盯着,但对象创建不是用户的责任,而是由 Android 框架执行。

您的案例有Record extends MainActivity 并且 MainActivity 是一个 Activity 使得 Record 也是一个 Activity。所以你需要启动它,要么让它成为清单文件中的启动器主要活动,要么使用startActivity()(或startActivityForResult())。

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

参考另一篇文章的答案 https://stackoverflow.com/a/14956056/504133

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

【讨论】:

    【解决方案2】:

    错误说com.Record.startRecording(Record.java:63)是原因:java.lang.IllegalArgumentException: Invalid audio buffer size.

    在实例化新的AudioRecord 之前,请致电AudioRecord.getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat) 以确保您的缓冲区足够大。就像documentation 中所说的那样。

    请注意,您还应该通过调用getState()(并检查它是否返回STATE_INITIALIZED)来检查您的AudioRecord 实例是否已正确初始化。

    【讨论】:

    • 我还尝试了不同的课程,我没有使用录音机,但它也没有工作,当我在主要活动中一切正常时
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多