2013-04-18 44 views
0

我發現了用於從這個link以.wav格式存儲音頻的代碼。該代碼有兩個按鈕來啓動和停止錄製。我想在某段時間後停止錄音。它使用AudioRecord 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 
+1

爲什麼不使用計時器並調用停止錄音的邏輯? –

+0

如何停止計時器線程? –

回答

0

我找到了解決辦法 您可以使用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; 
} 

} 

啓動錄像機後調用此類。

new Auto_Stop_Task().execute(); 

感謝大家的幫助。

0

使用此代碼的onCreate 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"; 

TO

String mRcordFilePath = Environment.getExternalStorageDirectory() + "/testwave.wav"; 
+0

其顯示錯誤「無法對類型爲的非靜態方法postDelayed(Runnable,long)進行靜態引用」Handler「 –

+0

更改private static final String mRcordFilePath = Environment.getExternalStorageDirectory()+」/testwave.wav「; TO String mRcordFilePath = Environment.getExternalStorageDirectory()+「/testwave.wav」; –

+0

現在我得到一個空指針異常,應用程序甚至不啓動。我必須添加任何權限? –