使用线程进行 Android 媒体录制

2024-03-16

我正在开发一个 Android 应用程序,只需使用按钮即可开始和停止录制。 我用了线程。我创建了三个类..一个开始录制..一个停止录制和主类..

问题是我可以在手机中看到该文件,但它是空的,并且手机给我一条消息“无法播放视频”..我希望它与线程一起使用..我不需要其他方法..

这是我的代码 主要类:

public class MediaRecorderSampleActivity extends Activity {


    Button start;
    Button stop ; 
    private MediaRecorder recorder ;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        start = (Button)findViewById(R.id.startbtn); 
        stop = (Button)findViewById(R.id.stopbtn); 
        start.setOnClickListener(new btnClick());
        stop.setOnClickListener(new StopbtnClick());
        }



    class btnClick implements View.OnClickListener {
                public void onClick(View arg0) {
            Log.i("Media", "Start Clicked...");
            Thread startThread = new Thread ( new startRe (recorder));
            Log.i("Media", "start Thread Created");
            startThread.start() ; 
             Log.i("Media", "start Recording");

                }           
    }


    class StopbtnClick implements View.OnClickListener {
        public void onClick(View arg0) {
              Log.i("Media", "Stop Clicked...");
        // TODO Auto-generated method stub
            Thread stopThread = new Thread ( new stopRecording (recorder));
              Log.i("Media", "stop Thread Created");
    stopThread.start();
    Log.i("Media", "stop Recording");
        }

  }

      }

开始录制类

public class startRe implements Runnable {
private MediaRecorder recorder;


startRe( MediaRecorder r ) {
    Log.i("Media", "start cons");
    this.recorder = r ; 

}
public void run() {
    // TODO Auto-generated method stub
    Log.i("Media", "IN RUN start Recording");
    startRecording();
}


public void startRecording() {
    Log.i("Media", "IN Method start Recording");
    recorder = new MediaRecorder();
    Log.i("Media", "create variable");
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    Log.i("Media", "1");
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    Log.i("Media", "2");
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    Log.i("Media", "3");
    recorder.setOutputFile(getFilePath());
    try{
        Log.i("Media", "prepar");
        recorder.prepare();
        Log.i("Media", "before");
        recorder.start();
        Log.i("Media", "after");
    }catch (Exception e){
        e.printStackTrace();
    }

}


private String getFilePath() {
    String filePath = Environment.getExternalStorageDirectory().getPath();
    File file = new File(filePath, "MediaRecorderSample");

    if(!file.exists())
        file.mkdirs();

    return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + ".mp4" );
}


}

停止类

 public class stopRecording implements Runnable {
private MediaRecorder recorder ;

public stopRecording(MediaRecorder recorder2) {
    Log.i("Media", "Stop in Cos");
    // TODO Auto-generated constructor stub
    try {
    this.recorder = recorder2 ; }
    catch ( Exception e )
    {       
        Log.i("Media", "Stop out  Cos" + e.getMessage()) ;
        } 

}
public void run() {
    Log.i("Media", "Stop in RUN");
    stopRecording();
    Log.i("Media", "Stop out of RUN");

}

您如何使用该对象存在问题MediaRecorder。您需要在 Activity 类中创建该对象,然后将该对象传递给两个Runnable..

因此您需要进行以下更改:

在Activity类中创建对象,代码如下:

 private MediaRecorder recorder ;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        start = (Button)findViewById(R.id.startbtn); 
        stop = (Button)findViewById(R.id.stopbtn); 
        start.setOnClickListener(new btnClick());
        stop.setOnClickListener(new StopbtnClick());
         // Create the object in Activity so that both Runnable works on the same object...
         recorder = new MediaRecorder();
        }

将相同的对象传递给两个Runnable像你已经在做的那样上课。

不要在中创建对象startRecording()方法,因为它会创建一个本地对象并将其分配给一个无法从stopRecording Runnable..

public void startRecording() {
    Log.i("Media", "IN Method start Recording");
    // comment this recorder = new MediaRecorder();
    Log.i("Media", "create variable");
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    Log.i("Media", "1");
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    Log.i("Media", "2");
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    Log.i("Media", "3");
    recorder.setOutputFile(getFilePath());
    try{
        Log.i("Media", "prepar");
        recorder.prepare();
        Log.i("Media", "before");
        recorder.start();
        Log.i("Media", "after");
    }catch (Exception e){
        e.printStackTrace();
    }

}

尝试让我们知道结果...

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

使用线程进行 Android 媒体录制 的相关文章

  • RecyclerView 未显示列表中的所有项目

    我在用RecyclerView在我的应用程序中 每次我打开屏幕时 我只能看到一项 但当我调试时 它每次都会出现onBindViewHolder method 这是我的适配器 Override public ViewHolder onCrea
  • 生产中偶尔会发生 android.webkit.WebView 类膨胀错误

    我的应用程序在 Google Play 上 它在大多数设备 数千个用户 上运行良好 但在极少数情况下 占每日活跃用户百分比的一小部分 我得到Error inflating class android webkit WebView当我为我的片
  • Android平台源码中哪里可以找到版本信息

    Android 平台源文件中的版本信息在哪里找到 我尝试查找 设置 gt gt 中列出的有关手机的一些信息 显示的一些信息包括固件版本 模块编号 基带版本 内核版本 你可以给它办理登机手续platform build core versio
  • IntentService、Service 或 AsyncTask

    实现这一点的最佳方法是什么 我有一个 Android 应用程序 它将使用我的 python 服务器来允许两部手机之间进行轮流通信 回合意味着他们在一轮开始之前不能互相交谈 一旦他们发送一条消息 他们就不能发送另一条消息 直到对方做出回应 然
  • NumberPicker 的格式化值在单击时消失

    我的 NumberPicker 在setDescendantFocusability FOCUS BLOCK DESCENDANTS 模式和setWrapSelectorWheel false 已关闭 我用一个简单的格式化程序格式化了我的
  • Android 从键盘读取

    我的登录屏幕根本没有文本字段 当用户使用 RFID 扫描仪扫描他的 id 令牌时 我会得到一个 8 个字符长的字符串 其原理与使用键盘相同 只是更快 我希望我的登录活动在用户扫描其令牌时而不是之前执行 有一个聪明的方法来实现这个吗 我不能有
  • Android-全屏视频视图

    我正在尝试使此 VideoView 以全屏模式显示 public class ViewVideo extends Activity private String filename private static final int INSER
  • Android Accessibility 执行触摸操作

    我想知道是否可以使用 Android 辅助功能服务在屏幕上的位置执行触摸操作 例如 Bundle arguments new Bundle arguments putInt coord X X value arguments putInt
  • 错误:任务“:app:mergeDebugResources”执行失败。 > java.lang.ArrayIndexOutOfBoundsException(无错误消息)

    你们有人知道 Gradle 构建中的这个异常吗 Error Execution failed for task app mergeDebugResources gt java lang ArrayIndexOutOfBoundsExcept
  • 如何将 Google Now 搜索栏添加到我的应用程序中?

    谷歌刚刚将其搜索栏从 Google Now 引入到了 Play 商店应用程序中 如下面的 gif 所示 如何将这个操作栏搜索栏实现到我自己的应用程序中 我想要 style 汉堡动画 从工具栏按钮访问 麦克风按钮 对棒棒糖设备的连锁反应 我已
  • 将 firebase auth 与 google app engine 云端点集成

    有人可以指定 使用一些示例代码 如何验证谷歌云端点中的 firebase 令牌吗 最近提出的问题根本没有澄清 如何将 Firebase 身份验证与 Google 应用引擎端点集成 https stackoverflow com questi
  • 从 Handler.obtainMessage() 获取什么参数

    我正在使用线程来执行一些 BT 任务 我正在尝试向 UI 线程发送消息 以便我可以基于我的 BT 线程执行 UI 工作 为此 我使用处理程序 但我不知道如何检索发送到处理程序的数据 要发送数据 我使用 handler obtainMessa
  • Android 26 (O) 通知不显示操作图标 [重复]

    这个问题在这里已经有答案了 随着 Android 26 O 引入通知渠道 我一直在调查 Google 提供的com example android notificationchannels 这个示例按预期工作 直到我尝试添加Action到示
  • 如何从webkit浏览器中检测Android版本和品牌?

    如何通过webkit浏览器检测Android版本和品牌 可靠吗 我相信你可以检查用户代理 但是 我认为它不安全 因为有很多方法可以用来欺骗用户代理 在谷歌上搜索这个问题给了我们很多答案 它甚至可以在默认浏览器上运行 您只需输入 about
  • Android 发布到 facebook 墙,stream.publish 几天来就中断了

    我有很多使用 FB android sdk 发布的应用程序 github com facebook facebook android sdk 我所有使用 FB 的应用程序几天后就停止工作了 这必然是 FB 方面的更改或错误 因为我的应用程序
  • 与 Dagger 一起使用时,Espresso 生成 FileNotFoundException

    我一直在研究旧版 Android 应用程序 尝试为其添加测试和适当的架构 该应用程序有一个主要LaunchActivity它在启动时运行一系列检查 最初 该活动使用 Dagger 来 注入依赖项 活动将使用它来运行检查 但效果相当糟糕 我转
  • 确定视图是否在屏幕上 - Android

    我对这个有点困惑 首先也是最重要的是 以下链接很有用 但是我提出了一些可见性问题 链接 检查视图可见性 https stackoverflow com questions 4628800 android how to check if a
  • 为什么 ExpandableListView 更改 ChildView 设置(Android)?

    我对使用 ExpandableListView 有疑问 就我而言 我有两个组视图和两个子视图 而子视图由一个带有多个按钮 文本视图等的相对布局组成 例如 当首先扩展第二组并对视图持有者进行一些更改并随后扩展第一组时 先前所做的更改也会自动应
  • 在上下文操作模式下选择时,ListView 项目不会在视觉上“突出显示”

    我关注了 Android 官方网站创建上下文操作菜单的教程 http developer android com guide topics ui menus html CAB 使用下面的代码 当我长按我的 ListView 项目之一时 它确
  • 进程被杀死后不会调用 onActivityResult

    我有一个主要活动 Main 和另一个活动 Sub 由 Main 调用 startActivityForResult new Intent this SubActivity class 25 当我在 Sub 时 我终止该进程 使用任务管理器或

随机推荐

  • 加载 word2vec 时出现 UnicodeDecodeError 错误

    详细描述 我开始使用词嵌入 并发现了大量有关它的信息 到目前为止 我知道我可以训练自己的词向量或使用以前训练过的词向量 例如 Google 或 Wikipedia 的词向量 这些向量可用于英语 但对我来说没有用 因为我正在处理以下语言中的文
  • WSO2 Identity Server 5.1.0 未在 SAML 响应中返回用户声明

    在尝试新版本的 WSO2 Identity Server 5 1 0 时 我在返回 SAML 响应中的声明时遇到问题 虽然这在 WSO2 IS 5 0 0 SP1 中有效 我已经映射了所需的声明并将它们添加到我的 SP 此外我还配置了 SP
  • 使用 go 处理文件上传

    我最近才开始玩围棋 所以我还是个菜鸟 如果我犯了太多错误 抱歉 我已经尝试解决这个问题很长时间了 但我只是不明白发生了什么 在我的 main go 文件中 我有一个主要函数 func main http HandleFunc handler
  • 使用 FactoryGirl 时不断收到 record_invalid

    很多时候 当我在规范中使用 FactoryGirl 时 我不断收到如下错误 Failure Error f FactoryGirl build my model ActiveRecord RecordInvalid translation
  • 使用“sort”命令按多列对 CSV 文件进行排序

    我有一个类似 CSV 的文件 我想按列优先级对其进行排序 例如SQL 中的 ORDER BY https dev mysql com doc refman 8 0 en sorting rows html 例如 给定以下行 3 1 2 1
  • 如何使用 python urllib 忽略 Windows 代理设置?

    我希望 Python 在使用时忽略 Windows 代理设置urllib 我设法做到这一点的唯一方法是禁用 Internet Explorer 上的所有代理设置 有什么程序化的方式吗 os environ no proxy 不是一个好的选择
  • Symfony 3 根据远程 API 对用户进行身份验证

    我有一个应用程序 其中后端和前端由不同的主机提供服务 并且是两个不同的应用程序 均基于 Symfony 3 其中之一 后端ofc 处理业务逻辑并将用户及其角色保存在其数据库中 后端提供REST API供前端使用 我无法修改后端代码 因为它不
  • 如何选择所有列以及 Oracle 11g 中 CASE 语句的结果?

    我想选择 而不必键入所有单独的列 但我还想包含带有 case 语句的自定义列 我尝试了以下方法 select case when PRI VAL 1 then High when PRI VAL 2 then Med when PRI VA
  • Java MyBatis 存储过程调用带 OUT 参数

    第一个问题 我试图返回一个 OUT 参数 而不是带注释的结果集 首先 这可能吗 如果是的话 人们会怎样做呢 MyBatis 3 0 6 数据库 SQL Server 2008 以下是我在 UserDAO 中调用方法的语法示例 Select
  • Control.ResolveUrl 与 Control.ResolveClientUrl 与 VirtualPathUtility.ToAbsolute

    在解析以波形符 开头的路径时 使用其中一种方法比使用另一种方法有什么好处吗 一般来说 更好的做法是什么 您应该在 html 中发送相对路径还是绝对路径 ResolveUrl 和 ResolveClientUrl 的区别在于 ResolveC
  • MongoDB 记录太多?

    我有一个与 MongoDB 交互的 PHP 应用程序 直到最近 该应用程序运行良好 但几天前我发现该应用程序开始响应非常慢 其中一个收藏已突破 500K 条记录 因此 对该集合的任何查询的 MongCursor 都会超时 我认为 500K
  • 如何通过 ajax 操作向表添加行link

    我是 MVC4 的新手 我遇到了一个问题 当我想在 ajax 中向表中添加一行时 它似乎不是我想要的 这是我的代码 table thead tr th T n h c sinh th th Gi o l vi n th th N m H c
  • 避免序列化 REST 服务中的某些属性

    我有一个 Net应用程序分为客户端和服务器端 服务器提供REST服务 使用WCF 我有这样的服务定义 WebGet UriTemplate Customers id Customer GetCustomerById string id We
  • 对类型为其他模型的属性进行环回验证

    我定义了两个模型 位置和地址 定义如下 address properties address1 type string required true public true dataSource db plural addresses loc
  • Flask 蓝图在蓝图中查找静态文件而不是根目录

    我的蓝图应该在根目录中查找静态文件 但事实并非如此 假设我有一个名为 前端 的蓝图 frontend 仅传入了 template folder frontend 即使我将静态文件放在 app frontend static file css
  • 如何:Parallel.Foreach 执行许多进程,每个进程运行一个新进程(但一次一个)? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我确信有人知道这一点 我将非常感谢您
  • 休眠中的未知实体

    执行主类时出现此错误 我正在尝试在表投资组合中插入新记录 正如您所看到的 我使用 Hibernate ORM 模型来做到这一点 另外 可以说 hibernate 与数据库的连接没有任何问题 Exception in thread main
  • 同一模型上雄辩的亲子关系

    我有一个模型CourseModule 并且每个项目都与同一模型相关 数据库结构 模型中的关系 public function parent return this gt belongsTo App CourseModule parent i
  • Java接口命名约定[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用线程进行 Android 媒体录制

    我正在开发一个 Android 应用程序 只需使用按钮即可开始和停止录制 我用了线程 我创建了三个类 一个开始录制 一个停止录制和主类 问题是我可以在手机中看到该文件 但它是空的 并且手机给我一条消息 无法播放视频 我希望它与线程一起使用