【问题标题】:Record sound in Android and read Amplitude在 Android 中录制声音并读取 Amplitude
【发布时间】:2012-08-14 16:04:17
【问题描述】:

我正在尝试制作一个应用程序,它可以录制一秒钟的声音,然后从录制的声音中读取最大幅度。这是我目前所拥有的,但我的应用程序崩溃了,我不知道为什么。

这是我的第二个活动,我在按下“记录”按钮后从第一个活动中调用它。该应用在我的模拟器和手机上崩溃。

package radu.soundSampler;

import java.io.IOException;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import android.media.MediaRecorder;

public class DisplayMessageActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //Intent intent = getIntent();
    //String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

    MediaRecorder rec = new MediaRecorder();
    rec.setAudioSource(MediaRecorder.AudioSource.MIC);
    rec.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
    rec.setOutputFile("/newRecording");
    rec.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

    try {
        rec.prepare();
    } catch (IllegalStateException e) {

    } catch (IOException o) {

    }
    rec.start();
            for(int i=0;i<100000;i++);
    rec.stop();
    int rezultat = rec.getMaxAmplitude();

    TextView textView = new TextView(this);
    textView.setTextSize(40);

    textView.setText(Integer.toString(rezultat));

    setContentView(textView);
}

}

我电脑上的(更新)错误日志显示:

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 (Read-only file system)
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.<init>(FileOutputStream.java:94)
08-18 14:06:11.918: W/System.err(811):  at java.io.FileOutputStream.<init>(FileOutputStream.java:165)
08-18 14:06:11.918: W/System.err(811):  at java.io.FileOutputStream.<init>(FileOutputStream.java:144)
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.permission.RECORD_AUDIO 权限吗?
  • 不,我应该把它放在哪里?
  • 没关系,我找到了在哪里放置权限 :) 谢谢,我希望它现在可以工作。
  • 在清单文件中添加&lt;uses-permission android:name="android.permission.RECORD_AUDIO" /&gt; 后,它不起作用,它仍然在我的手机和我的模拟器上崩溃。
  • 您正在捕获异常,但您没有对它做任何事情?为什么?为什么不打印异常的堆栈跟踪。

标签: java android audio record amplitude


【解决方案1】:

使用setOutoutFile(getExternalFilesDir().getAbsolutePath() + "/newRecording")

确保您在清单中拥有此权限

&lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt;

不要执行忙等待循环。使用计时器。

不要忽略准备中的异常。

【讨论】:

  • 我已经在我上一个版本的代码中添加了这两个,但它仍然无法工作。我只是没有更新问题中的代码。我确实使用您使用的确切行设置了输出文件,在手机上测试了应用程序并创建了newRecording 文件,但没有数据。并且该应用仍然崩溃,并且与上次发布的错误堆栈相同。
  • 您的问题可能出在调用准备中,但您隐藏了异常。打印它们,看看有什么问题。你使用 MediaRecorder.OutputFormat.DEFAULT.
【解决方案2】:

如果您只是想记录麦克风的“音量”,那么您可以将输出重定向到null,如下所示:

recorder = new MediaRecorder();
// following calls throw Illegal State Exceptions, but here we follow the proper order

recorder.setAudioSource(AudioSource.MIC);

// After set audio source
recorder.setOutputFormat(OutputFormat.THREE_GPP);

// After set output format
recorder.setAudioEncoder(AudioEncoder.AMR_NB);
recorder.setOutputFile("/dev/null");
// Before prepare

try {
    recorder.prepare();
} catch (IOException e) {
    System.err.println(e);
}
// After prepare
recorder.start();

// Call getMaxAmplitude() with a zero returned value, so you can recall later
recorder.getMaxAmplitude();

另外,您不应该在onCreate 内进行虚假延迟。改为使用处理程序:

public void onCreate(Bundle savedInstanceState) {

    // ...

    handler = new Handler();
    handler.postDelayed(this, 1000);
}

public void run() {
    int value = recorder.getMaxAmplitude();
    recorder.stop();

    // etc
}

【讨论】:

  • 这样做安全吗?我们是否必须将此临时文件标记为垃圾收集或类似的东西?
  • @jesses.co.tt 我们不使用临时文件;我们redirect output to "nothing",以便专注于输入。
  • 复制那个......不是完全确定意思,但那个链接有帮助,谢谢!
【解决方案3】:

试试这个方法.....

    int rezultat = 0;   

try {
        rec.prepare();

        rec.start();

        TimeUnit.SECONDS.sleep(1);  

        rec.stop();

    } catch (IllegalStateException e) {

    } catch (IOException o) {

    } catch (InterruptedException e) {      

    }

     rezultat = rec.getMaxAmplitude();

【讨论】:

    【解决方案4】:

    首先,您需要将您的记录放在允许您书写的地方。

    File parent = getContext().getFilesDir();
    File recordFile = new File(parent, "newRecording");
    

    是一个正确的开始。 (还有其他)

    【讨论】:

      【解决方案5】:

      您无法在根文件系统中创建文件,因为您正在尝试使用rec.setOutputFile("/newRecording")。创建一个临时文件并将其写入那里。您可能需要检查获取私有文件目录getFilesDir() 及相关文件的方法。

      您得到的异常确切地告诉您:FileNotFoundException 发生并显示prepare() 调用失败。因此你MediaRecoder 没有准备好,你将无法start() 因为它处于错误状态。

      另一条评论:要在停止录制之前等待一秒钟,请使用 Thread.sleep() 而不是 for 循环计数。其次,请在后台线程中执行此操作,因为以任何方式阻塞 UI 线程都可能使您的 UI 迟缓,在最坏的情况下,Android 可能会因 ANR 异常而终止您的应用程序。

      【讨论】:

        【解决方案6】:

        您的活动崩溃,因为 onCreate() 方法中引发了异常。你应该绝对避免这种情况发生。 从单独的线程调用您的 prepare() 方法(或任何与活动初始化无关的方法),并始终在 catch 块中显示调试消息。

        根据经验:永远不要写一个空的 catch {} 块。事后你总会后悔的(相信我)

        【讨论】:

          【解决方案7】:

          致敬!

          您的问题可能是因为您没有在 Android 上使用正确的目录。如我所见,您使用的是\,它是根目录,它当然是只读的。

          要解决这个问题,您可以像这样将外部存储路径添加到文件中:

          String externalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;
          
          // Your code here
          
          rec.setOutputFile(externalStoragePath + "newRecording");
          

          这应该可以解决问题。如果不行,请留言。

          附:在onCreate() 的顶部放置一个断点并调试您的应用程序以查看其失败的确切位置。

          【讨论】:

            猜你喜欢
            • 2012-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-22
            相关资源
            最近更新 更多