录制第二个音频剪辑时 MediaRecorder 崩溃

2024-02-25

我正在尝试使用 MediaRecorder 录制音频剪辑,但当我启动、停止和再次启动时,我的 Logcat 中不断出现这些错误;该活动也将结束:

INFO/DEBUG(1285): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
INFO/DEBUG(1285): Build fingerprint: 'LGE/thunderg/thunderg/thunderg:2.2.1/FRG83/eng.nikech.choi.20110126.134422:user/release-keys'
INFO/DEBUG(1285): signal 11 (SIGSEGV), fault addr 00000010
INFO/DEBUG(1285):  r0 00000000  r1 00000000  r2 a930cc98  r3 00000001
……
INFO/DEBUG(1285):          #00  pc 00033c28  /system/lib/libmedia.so
INFO/DEBUG(1285):          #01  pc 0000780e  /system/lib/libmedia_jni.so
……
INFO/DEBUG(1285): code around pc:
INFO/DEBUG(1285): a9033c08 2001e001 1c1861a0 46c0bd70 00029a58 
……
INFO/DEBUG(1285): code around lr:
INFO/DEBUG(1285): a93077f0 f7ffb510 bd10ffcf b082b570 ae011c05 
……
INFO/DEBUG(1285): stack:
INFO/DEBUG(1285):     bef054d0  00000001 
……

音频片段已录制并可以在计算机上播放,但如果我想录制另一个片段,则会发生上述情况。我已经在清单中请求许可:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>

我使用了 Ben McCann 的代码:

import java.io.File;
import java.io.IOException;

import android.media.MediaRecorder;
import android.os.Environment;

/**
 * @author <a href="http://www.benmccann.com">Ben McCann</a>
 */

public class AudioRecorder {

  final MediaRecorder recorder = new MediaRecorder();
  final String path;

  /**
   * Creates a new audio recording at the given path (relative to root of SD card).
   */
  public AudioRecorder(String path) {
    this.path = sanitizePath(path);
  }

  private String sanitizePath(String path) {
    if (!path.startsWith("/")) {
      path = "/" + path;
    }
    if (!path.contains(".")) {
      path += ".3gp";
    }
    return Environment.getExternalStorageDirectory().getAbsolutePath() + path;
  }

  /**
   * Starts a new recording.
   */
  public void start() throws IOException {
    String state = android.os.Environment.getExternalStorageState();
    if(!state.equals(android.os.Environment.MEDIA_MOUNTED))  {
        throw new IOException("SD Card is not mounted.  It is " + state + ".");
    }

    // make sure the directory we plan to store the recording in exists
    File directory = new File(path).getParentFile();
    if (!directory.exists() && !directory.mkdirs()) {
      throw new IOException("Path to file could not be created.");
    }

    recorder.reset();
    System.out.println("reset");
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    System.out.println("setAudioSource");
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    System.out.println("setOutputFormat");
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    System.out.println("setAudioEncoder");
    recorder.setOutputFile(path);
    System.out.println("setOutputFile");
    recorder.prepare();
    System.out.println("prepare");
    recorder.start();
    System.out.println("start");
  }

  /**
   * Stops a recording that has been previously started.
   */
  public void stop() throws IOException {
    recorder.stop();
    System.out.println("stopped");
    recorder.release();
    System.out.println("released");
  }

}

My code:

import java.io.IOException;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class TestActivity extends Activity implements OnClickListener {

    private final String TAG = TestActivity.class.getSimpleName();

    Button startRecord;
    Button stopRecord;
    boolean recordStarted = false;
    private static String fileName = "/Recordings/event.3gp";
    AudioRecorder audioRecorder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.record);

        startRecord = (Button)findViewById(R.id.buttonStartRecord);
        stopRecord = (Button)findViewById(R.id.buttonStopRecord);

        startRecord.setOnClickListener(this);
        stopRecord.setOnClickListener(this);
        audioRecorder = new AudioRecorder(fileName);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "resumed");
    }

    @Override
    protected void onPause() {
    super.onPause();
    Log.d(TAG, "paused");
    }

    @Override
    public void onClick(View v) {
        if (v == startRecord){
            try {
                audioRecorder.start();
                Toast.makeText(this, R.string.msgRecordSuccessful,
                    Toast.LENGTH_SHORT).show();
                recordStarted = true;
                Log.e(TAG, String.format("recording: %s", recordStarted));
            } catch (IOException e) {
                e.printStackTrace();
                Toast.makeText(this, R.string.msgRecordFail, Toast.LENGTH_SHORT).show();
            }
        } else if (v == stopRecord){
            if (recordStarted == true) {
                try {
                    audioRecorder.stop();
                    recordStarted = false;
                    Log.e(TAG, String.format("recording: %s", recordStarted));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                Toast.makeText(this, R.string.msgNotRecording, Toast.LENGTH_SHORT).show();
            }
        }
    } // end onClick

}

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:text="start"
        android:id="@+id/buttonStartRecord"></Button>
    <Button android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:id="@+id/buttonStopRecord"
        android:text="Stop"></Button>

</LinearLayout>

Strings:

<string name="msgReset">reset</string>
<string name="msgSetAudioSource">setAudioSource</string>
<string name="msgSetOutputFormat">setOutputFormat</string>
<string name="msgSetAudioEncoder">setAudioEncoder</string>
<string name="msgSetOutputFile">setOutputFile</string>
<string name="msgPrepare">prepare</string>
<string name="msgStart">start</string>

我没有很多编程经验,我不知道这意味着什么,也不知道如何在 Google 中搜索这个问题......如果有人能给我指出一个大致的方向,那就太好了:D

谢谢你!!

- - - - - - 更新 - - - - - - - -

@蒂姆 logcat 中的调试块之后的几行:

INFO/ActivityManager(1362): Process com.bcit.chairlogger (pid 26461) has died.
INFO/WindowManager(1362): WIN DEATH: Window{44f04e20 com.bcit.chairlogger/com.bcit.chairlogger.TestActivity paused=false}
INFO/ActivityManager(1362): Displayed activity com.bcit.chairlogger/.TestActivity: 106629 ms (total 106629 ms)
INFO/UsageStats(1362): Unexpected resume of com.lge.launcher while already resumed in com.bcit.chairlogger
WARN/Flex(1456): getString FLEX_OPERATOR_CODE TLS
WARN/Flex(1456): getString FLEX_OPERATOR_CODE TLS
INFO/#LGIME(1442): #### onStartInput: restarting=false, fieldId=-1
WARN/InputManagerService(1362): Got RemoteException sending setActive(false) notification to pid 26461 uid 10071

我有同样的错误,对我有用的解决方案“并且MediaRecorder recorder = new MediaRecorder();在 start() 的开头”(Android中的几种录音方式 https://stackoverflow.com/questions/13584217/several-audio-recording-in-android)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

录制第二个音频剪辑时 MediaRecorder 崩溃 的相关文章

  • Eclipse 在处理 xml(传入或传出)时挂起。此时CPU+磁盘尖峰

    我每天必须处理许多 XML 这极大地打断了我的工作流程 我尝试降级到 Indigo 但所有附加组件都被删除 打开xml时出现问题 切换到 xml 切换出一个 xml 甚至切换到另一个 xml 到底发生了什么事情让 XML 如此烦人 我可以禁
  • 如何在 M1 Mac 上运行的模拟器上运行旧版 Android 版本(例如 API 级别 21)?

    虽然现在有一个适用于 M1 mac 的 Android Studio 和支持arm架构的Android模拟器镜像 https stackoverflow com questions 64907154 android studio emula
  • 通过意图使用多个电话号码添加新联系人

    我想使用添加新联系人ContactsContract Intents Insert 但问题是我不知道可以有多少个电话号码 据我了解 我只能使用三个电话号码PHONE SECONDARY PHONE TERTIARY PHONE常数 有什么办
  • 多种语言的多种字体

    我最近在开发应用程序时遇到了一种情况 我必须在文本视图中显示不同的语言 目前我正在展示一些使用字体 字体像这样 Typeface tf Typeface createFromAsset this getAssets DroidHindi t
  • 如何使用数据绑定将点击侦听器设置为 LinearLayout

    我目前正在尝试将点击侦听器设置为LinearLayout查看在 xml使用数据绑定的布局文件 我已经设法让它在其他视图上很好地工作 比如Button or TextView 但由于某种原因 它不能与LinearLayout 这是我尝试的基本
  • Google 地图位于活动的中间区域

    我正在使用 Android studio 2 1 2 我检查了一下 大多数问题要么使用旧版本的 Android studio 要么使用一些旧的类 这些类不适用于我的情况 从文件 gt 新项目 gt 我使用了选项Google Maps Act
  • 如何调试“com.android.okhttp”

    在android kitkat中 URLConnection的实现已经被OkHttp取代 如何调试呢 OkHttp 位于此目录中 external okhttp android main java com squareup okhttp 当
  • Cordova + android:无法从应用程序打开拨号盘或邮件意图

    我有一个奇怪的问题 我无法从应用程序中打开带有预定义号码或邮件意图的拨号盘 我正在使用 netbeans 8 0 1 创建 cordova 应用程序 我的 Cordova 版本是 4 0 0 我按照步骤创建了一个应用程序 并选择了 Hell
  • 警报对话框中的 Webview 不显示内容

    我正在开发一个 Android 应用程序 我需要在网络视图和警报对话框上显示一个网站 该站点显示在网络视图中 但不显示在警报对话框中 到目前为止 这是我的代码 WebView WebView myWebView WebView v find
  • Android Gradle 问题 - Flutter / Dart

    我的 Gradle 同步有问题 我使用 IntelliJ 和 Android Studio 构建 Flutter Dart 应用程序 我添加了 2 个新的依赖项 现在 Gradle 出现了问题 在 Android Studio 中一切正常
  • Android:canvas.drawBitmap() 方法无法正常工作

    我已经发布了两个与此相关的问题 请参考此自定义饼图 1 https stackoverflow com questions 28343600 customize pie chart in quarter shape at the botto
  • Jetpack Compose 中复选框中的透明复选标记

    在我的 Compose 应用程序中 我需要创建一个圆形复选框 我已经通过下面的代码实现了这一点 Composable fun CircleCheckBox isChecked Boolean modifier Modifier Modifi
  • Android 为什么这不会抛出错误的线程异常?

    我的印象是视图只能从主线程操作 但是 为什么这不会崩溃 public class MainActivity extends Activity TextView tv Override protected void onCreate Bund
  • Android SHA1 发布密钥库无法与 Google 地图配合使用

    我正在使用 Google Maps Android API 但遇到了一些问题 我正在使用 android studio 签署我的 apk 在 android keystore jks 创建一个 另外 我选择 发布 作为其中的类型 我已经使用
  • 找不到数据库路径是不可能的

    我对 android 开发很陌生 现在我正在尝试通过扩展 SQLiteOpenHelper 的类创建数据库 我确信数据存储在我的 Nexus 7 我用来测试应用程序的设备 上的某个位置 但是我找不到数据库的路径 我四处寻找其他类似的问题 所
  • 在android中从SD卡上传图像到facebook

    我无法从 SD 卡上传 Facebook 上的图像 我使用了下面的代码 但它没有给我错误 但同时它没有上传图像 byte data null try FileInputStream fis new FileInputStream filep
  • Eclipse 中的 Java EE 视角

    我有标准版的 eclipse Galileo 现在我想在上面开发企业应用程序 知道如何获得 Java EE 视角吗 标准版如何安装Java EE工具 我有同样的问题 我首先使用 Ubuntu 软件中心安装了最新的 Eclipse 平台 In
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v
  • Android Espresso 单击按钮时出现错误

    我正在尝试使用 espresso 框架为 Android 应用程序编写一些 UI 测试 现在我只是检查启动屏幕上是否存在所有元素 然后尝试单击登录按钮 单击按钮时 测试由于错误而失败 我似乎无法理解为什么会发生这种情况 我的测试代码是 Ru
  • Keystore getEntry 在 Android 9 上返回 NULL

    c我已对存储在 Android 密钥库中的登录密码进行了加密和解密 在 Android 9 上 我观察到应用程序在尝试解密密码时崩溃 我无法重现它 但拥有 Pixel 3 的用户是崩溃的设备之一 下面是我如何从密钥库解密密码 private

随机推荐

  • E492:不是编辑器命令:NERDTree

    当我跑步时vim 打开文件夹时出现以下错误 Error detected while processing VimEnter Auto commands for E492 Not an editor command NERDTree Pre
  • Firefox 插件的“document_start”?

    我来自 Chrome 扩展 所以我习惯于通过设置来定义何时注入文件run at 例如 到document start用于在 DOM 构建之前进行注入 Firefox 插件有等效的吗 是的 相当于content document global
  • 用户提供的 Terminate() 函数必须是线程安全的吗?

    如中所述http en cppreference com w cpp error terminate http en cppreference com w cpp error terminate调用终止的原因有很多 我可以想象其中一些原因几
  • 在 Ruby 数组中收集重复项的最快/单行方法?

    转换数组的最快 单行方法是什么 1 1 1 1 2 2 3 5 5 5 8 13 21 21 21 到这样的对象数组中 1 gt 4 2 gt 2 3 gt 1 5 gt 3 8 gt 1 13 gt 1 21 gt 3 为了实现您想要的格
  • 如何等待WPF绑定延迟完成

    我的 ViewModel 实现了 INotifyPropertyChanged 和 INotifyDataErrorInfo 接口 当属性更改时 将触发验证 从而启用 禁用 保存 按钮 由于验证步骤非常耗时 因此我使用了 延迟 绑定属性 我
  • GAPI 的 OAuth - 首次登录 Javascript 后避免身份验证和授权

    我创建了一个 chrome 扩展 可以读取电子邮件 执行某些操作并使用 javascript 的 google 客户端 API 创建任务 我使用 chrome 身份进行身份验证和授权 扩展按预期工作 然而 它每隔一段时间就会要求签名 我想要
  • Boost::Log 和日志编号

    我最近尝试通过 Boost log 将一些日志记录添加到一个小型应用程序中 但是 使用日志轮换 由于某种原因 我无法让它在日志目录中拾取正确的计数器 例如 如果我的Logs目录包含文件Log 000 log and Log 001 log我
  • 将 javascript 注入 SwiftUI WebKit

    如何将 SwiftUI WebKit 视图的文本大小设置为 State 变量 我有这段代码 允许我在 SwiftUI 中使用 WebViews import SwiftUI import WebKit struct WebView UIVi
  • 如何在 Angular 2 中实现 Chart.js?

    我正在使用最新版本的 Angular 2 V4 0 0 并且我想在我的项目中使用 Chart js 库中的图表 而不会有太多复杂性 如何在我的 Angular 项目中实现 Chart js 并且不会在最终生产中给我带来问题 您可以按照以下说
  • 如何在Opencart中添加子选项?

    我使用的是最新的3 0 2 0版本的opencart 对于选项 我想添加子选项 我也想像选项一样对子选项进行定价 从 2009 年及更早的时间起 有很多关于 opencart 的依赖选项的讨论 但它从未出现在核心版本中 为什么大家都说实现依
  • 有任何 API 或 Web UI 项目来管理 Docker 私有注册表吗?

    我找不到如何管理私人注册表中的图像 我可以推送或拉取图像 因为我知道 id 但如何获取推送图像的列表 举例来说 一个人想要查看其组织的私人注册表下的可用图像 她该怎么办 除非我弄错了 否则我找不到 API 或 Web UI 来发现注册表内容
  • 更改 Mac/Linux 上进程的用户所有者?

    我有一个以 root 身份运行的程序 该应用程序调用另一个程序 processA 来运行 当 processA 运行时 它由 root 拥有 但我希望它的所有者是当前登录的用户 怎么做 嗯 这有点棘手 取决于它是守护进程 服务 还是运行此命
  • 可以从 Google Chrome 设置面板中的地址栏(小书签)运行 Javascript 吗?

    我想制作一个书签来打开谷歌浏览器的设置面板并通过单击清除我的缓存 一段时间以来 我有一个书签 可以打开 Chrome 的设置面板 并已选择 清除缓存 设置 单击书签 通常在新选项卡中打开它 后 我必须打开该选项卡并提交表单 然而 在开发时
  • msiexec MsiSetExternalUI 的外部处理程序

    早上好 我希望为 msiexec 实现一个外部处理程序 但不能阻止 msiexec 执行任何不同的操作 我希望能够利用 MsiSetExternalUI 拦截所有消息 但仍然对最终用户具有相同的响应和对话框 我的主要目标是拦截安装 msi
  • UIImage 方面适合并对齐到顶部

    看起来像aspect fit默认情况下将图像与框架底部对齐 有没有办法override对齐同时保持aspect fit intact 编辑 这个问题早于自动布局 事实上 在提出这个问题的同一周 汽车布局就在 WWDC 2012 上公布了 简
  • 如何使用 ChefSpec 测试我的 LWRP?

    我创建了自定义 LWRP 但是当我运行ChefSpec https github com sethvargo chefspec单元测试 它不知道我的 LWRP 操作 这是我的resource actions install uninstal
  • 配置文件模板生成makefile

    Linux 中几乎所有开源 C 项目都有一个 配置 文件 用于在构建源代码之前生成 Makefile 我正在从头开始编写一个项目 这个 配置 文件有任何模板吗 大多数时候 配置文件不是手动创建的 而是由诸如autoconf http www
  • 在 Windows 10 上的 Lyrix.exe(Delphi 7 旧应用程序)上加载数据库时出错

    有一个用 Delphi 7 编写的名为 Lyrix 的应用程序 似乎 我只有可执行文件夹 以及不再运行的安装程序 我无法让它在 Windows 10 上运行 但它似乎在 Windows XP 7 和 8 1 上运行良好 它说 Error c
  • 如何使用CHMOD获得“drwx---r-x+”文件夹权限? - Bash 脚本 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在通过网络移动某些文件时遇到问题 这似乎是由文件权限引起的 目前我有具有此权限 drwxrwxrwx 的文件夹 我需要运行一个 bash
  • 录制第二个音频剪辑时 MediaRecorder 崩溃

    我正在尝试使用 MediaRecorder 录制音频剪辑 但当我启动 停止和再次启动时 我的 Logcat 中不断出现这些错误 该活动也将结束 INFO DEBUG 1285 INFO DEBUG 1285 Build fingerprin