如何自动限制 Android 录音长度?

Posted

技术标签:

【中文标题】如何自动限制 Android 录音长度?【英文标题】:How to automatically limit Android audio recording length? 【发布时间】:2012-02-17 00:44:28 【问题描述】:

我有这个工作代码。我需要它只在有限的时间内录制,而不需要用户点击。我该怎么做?

    MediaRecorder recorder = new MediaRecorder();
File outputFile = new File(file);
recorder.setAudiosource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(outputFile.getAbsolutePath());
try 
    recorder.prepare();
 catch (IllegalStateException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();
 catch (IOException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();

recorder.start();
recorder.setMaxDuration(60000);
// stop
recorder.stop();
recorder.reset(); 
recorder.release();

【问题讨论】:

【参考方案1】:

这会做得很好:(在准备/启动功能之前使用setMaxDuration)

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(outputFile.getAbsolutePath());

recorder.setMaxDuration(60000);
recorder.prepare();
recorder.start();

【讨论】:

谢谢,这行得通……但其他人都知道,理想情况下,您需要一些东西来通知用户录制已停止,因为他们不知道。但是,如果您查看生成的文件,它只是分配的有限秒数。所以谢谢。【参考方案2】:

使用setMaxDurationsetOnInfoListener 获取通知UI 的回调。

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(outputFile.getAbsolutePath());

recorder.setMaxDuration(60000);
recorder.prepare();
recorder.setOnInfoListener(new MediaRecorder.OnInfoListener() 
    @Override
    public void onInfo(MediaRecorder mr, int what, int extra) 
        if(what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED)
            Toast.makeText(context, "Recording stops. Limit reached", Toast.LENGTH_LONG).show();
        
    
);
recorder.start();

【讨论】:

【参考方案3】:

你应该把你的 recorder.stop() 等调用放在一个计时器中

这里是如何使用定时器任务的说明链接http://developer.android.com/resources/articles/timed-ui-updates.html

Timer timer = new Timer();
timer.schedule(new FinishRecordingTask(), 100, 200);

在你调用 recorder.start() 之后添加它

【讨论】:

【参考方案4】:

这可能是一个有点讨厌的方法。但这就是我所做的,

使用 mediaplayer.start() 启动 mediaPlayer 后,像这样启动与它平行的线程,

 thread passMusic=new Thread(new Runnable() 

        public void run() 
            try 

                Thread.sleep(60000);
                mediaplayer.pause();
                mediaplayer.stop();
                mediaplayer.release();
             catch (InterruptedException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            


        
    );passMusic.start();

现在您可以使用处理程序来更新您的 UI 或其他内容。

【讨论】:

实际上将其与 woliu 的答案结合使用是一种很好的方法。他的回答会限制录音,但你的回答是让用户知道它已经完成的一个很好的解决方案,例如,你可以在时间限制后出现敬酒。谢谢!虽然必须通过活动发布Toast(而不是Thread),但这是一个单独的问题,答案在堆栈上。 Thread.sleep 不准确!请阅读此***.com/questions/17561380/…

以上是关于如何自动限制 Android 录音长度?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Intent 限制录音时间?

手把手教你Android来去电通话自动录音的方法

录音怎么保存 如何保存电话录音

Android6.0 编程实现双向通话自动录音功能的方法详解

Android 系统搜索框 如何限制输入字数长度?

解决Flutter输入框限制最大输入长度时,从中间输入会自动截取掉后面的内容