Android 自动停止录音类中的录音

Android 自动停止录音类中的录音,android,audio,Android,Audio,我从中找到了以.wav格式存储音频的代码。该代码有两个按钮用于开始和停止录制。我想在一段时间后停止音频录制。它使用Android的AudioRecord类来存储音频。是否可以这样做 04-19 08:20:00.688: E/AndroidRuntime(2405): FATAL EXCEPTION: main 04-19 08:20:00.688: E/AndroidRuntime(2405): java.lang.RuntimeException: Unable to start ac

我从中找到了以.wav格式存储音频的代码。该代码有两个按钮用于开始和停止录制。我想在一段时间后停止音频录制。它使用Android的AudioRecord类来存储音频。是否可以这样做

04-19 08:20:00.688: E/AndroidRuntime(2405): FATAL EXCEPTION: main
04-19 08:20:00.688: E/AndroidRuntime(2405): java.lang.RuntimeException: Unable to start    activity   ComponentInfo{com.example.androidwaverecorder/com.example.androidwaverecorder.MainActivity}:  java.lang.NullPointerException
04-19 08:20:00.688: E/AndroidRuntime(2405):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
04-19 08:20:00.688: E/AndroidRuntime(2405):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
04-19 08:20:00.688: E/AndroidRuntime(2405):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
04-19 08:20:00.688: E/AndroidRuntime(2405):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
04-19 08:20:00.688: E/AndroidRuntime(2405):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-19 08:20:00.688: E/AndroidRuntime(2405):     at android.os.Looper.loop(Looper.java:137)
04-19 08:20:00.688: E/AndroidRuntime(2405):     at android.app.ActivityThread.main(ActivityThread.java:5039)
04-19 08:20:00.688: E/AndroidRuntime(2405):     at java.lang.reflect.Method.invokeNative(Native Method)
04-19 08:20:00.688: E/AndroidRuntime(2405):     at java.lang.reflect.Method.invoke(Method.java:511)
04-19 08:20:00.688: E/AndroidRuntime(2405):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-19 08:20:00.688: E/AndroidRuntime(2405):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-19 08:20:00.688: E/AndroidRuntime(2405):     at dalvik.system.NativeStart.main(Native Method)
04-19 08:20:00.688: E/AndroidRuntime(2405): Caused by: java.lang.NullPointerException
04-19 08:20:00.688: E/AndroidRuntime(2405):     at   com.example.androidwaverecorder.MainActivity.onCreate(MainActivity.java:47)
04-19 08:20:00.688: E/AndroidRuntime(2405):     at  android.app.Activity.performCreate(Activity.java:5104)
04-19 08:20:00.688: E/AndroidRuntime(2405):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
04-19 08:20:00.688: E/AndroidRuntime(2405):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
04-19 08:20:00.688: E/AndroidRuntime(2405):     ... 11 more
04-19 08:31:55.766: E/Trace(2899): error opening trace file: No such file or directory (2)
04-19 08:31:55.766: W/Trace(2899): Unexpected value from nativeGetEnabledTags: 0
04-19 08:31:55.766: W/Trace(2899): Unexpected value from nativeGetEnabledTags: 0
04-19 08:31:55.766: W/Trace(2899): Unexpected value from nativeGetEnabledTags: 0
04-19 08:31:56.386: W/Trace(2899): Unexpected value from nativeGetEnabledTags: 0
04-19 08:31:56.386: W/Trace(2899): Unexpected value from nativeGetEnabledTags: 0
04-19 08:31:56.416: W/Trace(2899): Unexpected value from nativeGetEnabledTags: 0
04-19 08:31:56.416: W/Trace(2899): Unexpected value from nativeGetEnabledTags: 0

在创建MainActivity时使用此代码

final Runnable r = new Runnable()
    {
        public void run() 
        {
            if (WavAudioRecorder.State.ERROR == mRecorder.getState()) {
                        mRecorder.release();
                        mRecorder = WavAudioRecorder.getInstanse();
                        mRecorder.setOutputFile(mRcordFilePath);
                        btnControl.setText("Start");
                    } else {
                        mRecorder.stop();
                        mRecorder.reset();
                        btnControl.setText("Start");
                    }
                }
        }
    };

    handler.postDelayed(r, YOUR TIME IN MILLISEC);
编辑

 private static final String mRcordFilePath = Environment.getExternalStorageDirectory() + "/testwave.wav";

我找到了解决办法 您可以使用AsyncTask来执行此操作

简要说明如何操作: 当您开始录制时,在另一个类中创建一个线程,该线程将在所需的时间段内休眠,然后调用记录器停止函数

public class Auto_Stop_Task extends AsyncTask<Void,Void, Integer> {
//int flag=0;
@Override
protected Integer doInBackground(Void... arg0) {

    try {
        Thread.sleep(30000);
        MainActivity.mRecorder.stop();
        MainActivity.mRecorder.reset();
        //flag=1;
    } catch (InterruptedException e) {

        e.printStackTrace();
    }
    return null;
}

}

谢谢大家的帮助。

为什么不使用计时器并调用停止录制的逻辑?如何停止计时器线程?其显示错误“无法从类型处理程序对非静态方法postDelayed(Runnable,long)进行静态引用”更改私有静态最终字符串mRcordFilePath=Environment.getExternalStorageDirectory()+“/testwave.wav”;字符串mRcordFilePath=Environment.getExternalStorageDirectory()+“/testwave.wav”;现在我得到一个空指针异常,应用程序甚至没有启动。我必须添加任何权限吗?java.lang.RuntimeException:无法启动活动组件信息{com.example.androidwaverecorder/com.example.androidwaverecorder.MainActivity}:java.lang.NullPointerException。这是错误
public class Auto_Stop_Task extends AsyncTask<Void,Void, Integer> {
//int flag=0;
@Override
protected Integer doInBackground(Void... arg0) {

    try {
        Thread.sleep(30000);
        MainActivity.mRecorder.stop();
        MainActivity.mRecorder.reset();
        //flag=1;
    } catch (InterruptedException e) {

        e.printStackTrace();
    }
    return null;
}

}
new Auto_Stop_Task().execute();