在Android中录制声音并读取振幅。
在Android中录制声音并读取振幅。
我正在尝试制作一个录音应用,它可以录制一秒钟的声音,然后读取录制声音的最大振幅。这是我目前的代码,但我的应用程序崩溃了,我无法找出原因。这是我的第二个活动,在我按下“录制”按钮后从第一个活动中调用。我的模拟器和手机上的应用程序都崩溃了。
我在这里有一个错误日志,它说:
08-18 13:30:07.968: E/MediaRecorder(687): start called in an invalid state: 4
08-18 13:30:07.968: D/AndroidRuntime(687): Shutting down VM
08-18 13:30:07.968: W/dalvikvm(687): threadid=1: thread exiting with uncaught exception (group=0x40015560)
08-18 13:30:07.978: E/AndroidRuntime(687): FATAL EXCEPTION: main
08-18 13:30:07.978: E/AndroidRuntime(687): java.lang.RuntimeException: Unable to start activity ComponentInfo{radu.soundSampler/radu.soundSampler.DisplayMessageActivity}: java.lang.IllegalStateException
08-18 13:30:07.978: E/AndroidRuntime(687): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
08-18 13:30:07.978: E/AndroidRuntime(687): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-18 13:30:07.978: E/AndroidRuntime(687): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-18 13:30:07.978: E/AndroidRuntime(687): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08-18 13:30:07.978: E/AndroidRuntime(687): at android.os.Handler.dispatchMessage(Handler.java:99)
08-18 13:30:07.978: E/AndroidRuntime(687): at android.os.Looper.loop(Looper.java:123)
08-18 13:30:07.978: E/AndroidRuntime(687): at android.app.ActivityThread.main(ActivityThread.java:3683)
08-18 13:30:07.978: E/AndroidRuntime(687): at java.lang.reflect.Method.invokeNative(Native Method)
08-18 13:30:07.978: E/AndroidRuntime(687): at java.lang.reflect.Method.invoke(Method.java:507)
08-18 13:30:07.978: E/AndroidRuntime(687): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-18 13:30:07.978: E/AndroidRuntime(687): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-18 13:30:07.978: E/AndroidRuntime(687): at dalvik.system.NativeStart.main(Native Method)
08-18 13:30:07.978: E/AndroidRuntime(687): Caused by: java.lang.IllegalStateException
08-18 13:30:07.978: E/AndroidRuntime(687): at android.media.MediaRecorder.start(Native Method)
08-18 13:30:07.978: E/AndroidRuntime(687): at radu.soundSampler.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:29)
08-18 13:30:07.978: E/AndroidRuntime(687): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-18 13:30:07.978: E/AndroidRuntime(687): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-18 13:30:07.978: E/AndroidRuntime(687): ... 11 more
我认为模拟器可能无法“运行”麦克风,所以我安装了.apk文件到手机上,但它在那里也崩溃了。我不知道问题可能是什么,所以你能帮我吗,或者给我任何提示吗?
非常感谢您的帮助!
还有一个堆栈跟踪,您请求的是。我在catch语句中使用o.printStackTrace()和e.printStackTrace(),希望这是您要求我做的:
08-18 14:06:11.908: W/System.err(811): java.io.FileNotFoundException: /newRecording (只读文件系统)
08-18 14:06:11.908: W/System.err(811): at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
08-18 14:06:11.908: W/System.err(811): at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
08-18 14:06:11.918: W/System.err(811): at java.io.FileOutputStream.
08-18 14:06:11.918: W/System.err(811): at java.io.FileOutputStream.
08-18 14:06:11.918: W/System.err(811): at java.io.FileOutputStream.
08-18 14:06:11.918: W/System.err(811): at android.media.MediaRecorder.prepare(MediaRecorder.java:533)
08-18 14:06:11.918: W/System.err(811): at radu.soundSampler.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:23)
08-18 14:06:11.918: W/System.err(811): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-18 14:06:11.918: W/System.err(811): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-18 14:06:11.918: W/System.err(811): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-18 14:06:11.918: W/System.err(811): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-18 14:06:11.918: W/System.err(811): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08-18 14:06:11.918: W/System.err(811): at android.os.Handler.dispatchMessage(Handler.java:99)
08-18 14:06:11.918: W/System.err(811): at android.os.Looper.loop(Looper.java:123)
08-18 14:06:11.918: W/System.err(811): at android.app.ActivityThread.main(ActivityThread.java:3683)
08-18 14:06:11.918: W/System.err(811): at java.lang.reflect.Method.invokeNative(Native Method)
08-18 14:06:11.928: W/System.err(811): at java.lang.reflect.Method.invoke(Method.java:507)
08-18 14:06:11.928: W/System.err(811): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-18 14:06:11.928: W/System.err(811): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-18 14:06:11.928: W/System.err(811): at dalvik.system.NativeStart.main(Native Method)
08-18 14:06:11.928: E/MediaRecorder(811): start called in an invalid state: 4
08-18 14:06:11.928: D/AndroidRuntime(811): Shutting down VM
08-18 14:06:11.928: W/dalvikvm(811): threadid=1: thread exiting with uncaught exception (group=0x40015560)
08-18 14:06:11.948: E/AndroidRuntime(811): FATAL EXCEPTION: main
08-18 14:06:11.948: E/AndroidRuntime(811): java.lang.RuntimeException: Unable to start activity ComponentInfo{radu.soundSampler/radu.soundSampler.DisplayMessageActivity}: java.lang.IllegalStateException
08-18 14:06:11.948: E/AndroidRuntime(811): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
08-18 14:06:11.948: E/AndroidRuntime(811): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-18 14:06:11.948: E/AndroidRuntime(811): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-18 14:06:11.948: E/AndroidRuntime(811): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08-18 14:06:11.948: E/AndroidRuntime(811): at android.os.Handler.dispatchMessage(Handler.java:99)
08-18 14:06:11.948: E/AndroidRuntime(811): at android.os.Looper.loop(Looper.java:123)
08-18 14:06:11.948: E/AndroidRuntime(811): at android.app.ActivityThread.main(ActivityThread.java:3683)
08-18 14:06:11.948: E/AndroidRuntime(811): at java.lang.reflect.Method.invokeNative(Native Method)
08-18 14:06:11.948: E/AndroidRuntime(811): at java.lang.reflect.Method.invoke(Method.java:507)
08-18 14:06:11.948: E/AndroidRuntime(811): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-18 14:06:11.948: E/AndroidRuntime(811): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-18 14:06:11.948: E/AndroidRuntime(811): at dalvik.system.NativeStart.main(Native Method)
08-18 14:06:11.948: E/AndroidRuntime(811): Caused by: java.lang.IllegalStateException
08-18 14:06:11.948: E/AndroidRuntime(811): at android.media.MediaRecorder.start(Native Method)
08-18 14:06:11.948: E/AndroidRuntime(811): at radu.soundSampler.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:30)
08-18 14:06:11.948: E/AndroidRuntime(811): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-18 14:06:11.948: E/AndroidRuntime(811): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-18 14:06:11.948: E/AndroidRuntime(811): ... 11 more
08-18 14:06:14.181: I/Process(811): Sending signal. PID: 811 SIG: 9
问题出现的原因是,用户想要在Android设备上录制麦克风的音量,但是却没有找到直接获取音量的方法。为了解决这个问题,用户尝试将录音的输出重定向到null(即不保存录音文件),然后通过调用getMaxAmplitude()方法来获取音量值。
解决方法如下:
1. 创建一个MediaRecorder对象,并按照正确的顺序设置音频源、输出格式和音频编码器。
2. 将输出文件设置为"/dev/null",即空文件。
3. 调用prepare()方法准备录音器。
4. 调用start()方法开始录音。
5. 调用getMaxAmplitude()方法获取音量值。
另外,文章还提到了不应该在onCreate()方法中使用假的延迟,而应该使用Handler来实现延迟操作。具体做法是创建一个Handler对象,并在onCreate()方法中使用postDelayed()方法延迟执行一段代码,然后在其中获取音量值并停止录音。
以上方法是通过将录音输出重定向到null来实现获取麦克风音量的方式。这种方法并不会创建临时文件,因此不需要对临时文件进行垃圾回收。
通过将录音输出重定向到null,并调用getMaxAmplitude()方法来获取音量值,可以实现在Android设备上读取麦克风的音量。使用Handler来实现延迟操作,以避免在onCreate()方法中使用假的延迟。这种方法不需要创建临时文件,因此不需要进行垃圾回收。
在Android中录制声音并读取振幅的问题可能出现的原因是代码中的异常处理不完善,导致录音和读取振幅的操作没有正确执行。解决方法是对异常进行适当的处理,以确保录音和读取振幅的过程能够正常进行。
下面是一种可能的解决方法:
int rezultat = 0; try { rec.prepare(); rec.start(); TimeUnit.SECONDS.sleep(1); rec.stop(); } catch (IllegalStateException e) { // 处理IllegalStateException异常 } catch (IOException o) { // 处理IOException异常 } catch (InterruptedException e) { // 处理InterruptedException异常 } rezultat = rec.getMaxAmplitude();
以上代码通过使用try-catch语句块来捕获可能出现的异常,以确保录音和读取振幅的操作能够正常执行。在try语句块中,首先调用rec.prepare()方法准备录音,然后调用rec.start()方法开始录音。接着使用TimeUnit.SECONDS.sleep(1)方法让程序暂停1秒,以确保录音足够长。最后调用rec.stop()方法停止录音。
在捕获异常的catch语句块中,可以针对不同的异常类型进行相应的处理。对于IllegalStateException异常,可以通过添加适当的代码来处理该异常,例如给用户显示错误信息或进行其他操作。对于IOException异常和InterruptedException异常,也可以根据实际情况进行相应的处理。
最后,通过调用rec.getMaxAmplitude()方法获取录音的最大振幅,并将其赋值给变量rezultat。这样就可以获得录音的振幅值,以便后续的处理和分析。
在Android中录制声音并读取振幅时,可能出现以下问题及解决方法:
问题原因:
- 未正确设置输出文件路径。需要使用setOutoutFile(getExternalFilesDir().getAbsolutePath() + "/newRecording")
来设置输出文件路径。
- 权限问题。需要在清单文件中添加<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
权限。
- 使用忙等待循环。应使用定时器来代替忙等待循环。
- 忽略prepare方法中的异常。应该打印异常信息并查看具体出错的地方。
- 输出格式问题。尝试使用MediaRecorder.OutputFormat.DEFAULT
输出格式。
解决方法:
- 使用setOutoutFile(getExternalFilesDir().getAbsolutePath() + "/newRecording")
来设置输出文件路径。
- 在清单文件中添加<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
权限。
- 使用定时器来替代忙等待循环。
- 打印prepare方法中的异常信息并查看具体出错的地方。
- 尝试使用MediaRecorder.OutputFormat.DEFAULT
输出格式。