结果:

1.增加ActionList中的Action时,需要跳到Master界面,不能在Android4Phonel界面下。

2.如果不打开权限的话,会提示“该设备不支持停止录音操作”(Record audion改为True)。

3.播放的效果是播放一次就停止了。不是循环的。

实例代码:

 unit Unit1;

 interface

 uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
FMX.Controls.Presentation, System.Actions, FMX.ActnList, FMX.Media; const
AUDIO_FILENAME = 'test.mp3'; //录音保存的文件名 type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Label1: TLabel;
Label2: TLabel;
ActionList1: TActionList;
acStartRecording: TAction;
acStopRecording: TAction;
acPlay: TAction;
acStop: TAction;
MediaPlayer1: TMediaPlayer;
procedure ActionList1Update(Action: TBasicAction; var Handled: Boolean);
procedure acStartRecordingExecute(Sender: TObject);
procedure acStopRecordingExecute(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure acPlayExecute(Sender: TObject);
procedure acStopExecute(Sender: TObject);
private
{ Private declarations }
public
FMicrophone: TAudioCaptureDevice;
function HasMicrophone: Boolean;
function IsMicrophoneRecording: Boolean;
{ Public declarations }
end; var
Form1: TForm1; implementation
uses
system.IOUtils;//需要引入
{$R *.fmx}
{$R *.NmXhdpiPh.fmx ANDROID} //得到不同平台的录音文件保存路径
function GetAudioFileName(const AFileName: string): string;
begin
{$IFDEF ANDROID}
Result := TPath.GetTempPath + '/' + AFileName;
{$ELSE}
{$IFDEF IOS}
Result := TPath.GetHomePath + '/Documents/' + AFileName;
{$ELSE}
Result := AFileName;
{$ENDIF}
{$ENDIF}
end; procedure TForm1.acPlayExecute(Sender: TObject);
begin
if IsMicrophoneRecording then //如果在录音,则先停止录音
acStopRecording.Execute;
//以下播放录音文件 AUDIO_FILENAME
MediaPlayer1.FileName := GetAudioFileName(AUDIO_FILENAME);
MediaPlayer1.Play;
end; procedure TForm1.acStartRecordingExecute(Sender: TObject);
begin
acStop.Execute;//选择停止录音
if HasMicrophone then
begin
//准备将录音保存到文件 'test.mp3'
FMicrophone.FileName := GetAudioFileName(AUDIO_FILENAME);
try
FMicrophone.StartCapture; //开始录音
except
ShowMessage('该设备不支持录音操作。');
end;
end
else
ShowMessage('没有麦克风设备。');
end; procedure TForm1.acStopExecute(Sender: TObject);
begin
MediaPlayer1.Stop;
end; procedure TForm1.acStopRecordingExecute(Sender: TObject);
begin
if IsMicrophoneRecording then //如果正在录音
try
FMicrophone.StopCapture; { 停止录音 }
except
ShowMessage('该设备不支持停止录音操作。');
end;
end; procedure TForm1.ActionList1Update(Action: TBasicAction; var Handled: Boolean);
begin
//判断图片的可见性
case (HasMicrophone and (FMicrophone.State = TCaptureDeviceState.Capturing)) of
True: Label2.Text := '录音';
False: Label2.Text := '停止录音';
end;
//判断 4 个按钮的是否可按下
acStartRecording.Enabled := not IsMicrophoneRecording and HasMicrophone;
acStopRecording.Enabled := IsMicrophoneRecording;
acStop.Enabled := Assigned(MediaPlayer1.Media) and (MediaPlayer1.State =
TMediaState.Playing);
acPlay.Enabled := FileExists(GetAudioFileName(AUDIO_FILENAME)) and
(MediaPlayer1.State <> TMediaState.Playing);
end; procedure TForm1.FormCreate(Sender: TObject);
begin
//初始化录音设备
FMicrophone := TCaptureDeviceManager.Current.DefaultAudioCaptureDevice;
end; //判断是否有麦克风
function TForm1.HasMicrophone: Boolean;
begin
Result := Assigned(FMicrophone);
end; //判断是否在录音
function TForm1.IsMicrophoneRecording: Boolean;
begin
Result := HasMicrophone and (FMicrophone.State = TCaptureDeviceState.Capturing);
end; end.

最新文章

  1. 【SAP业务模式】之ICS(四):组织单元的配置
  2. C 调用redis缓冲
  3. Javascript中关键参数this浅析
  4. PHP 错误与异常 笔记与总结(14 )记录和发送异常信息
  5. (六)6.9 Neurons Networks softmax regression
  6. Umbraco(7)-The Navigation Menu And A Parent Page with Infinite Children
  7. LintCode-Hash Function
  8. sublime 2如何进入vim模式
  9. 第4章 同步控制 Synchronization ---哲学家进餐问题(The Dining Philosophers)
  10. Spring学习之路二——概念上理解Spring
  11. python系列之 - 并发编程(进程池,线程池,协程)
  12. 获取data-*属性值
  13. 最近在写h5的页面,发现有一款框架还不错给大家推荐一下
  14. 震惊!最全PyCharm教程
  15. Python 数据分析基础小结
  16. 用python2.7.9 写个小程序搜索某个目录下行有某关键字
  17. mysql中json_remove函数的使用?
  18. 【Android】Android中如何取消调转界面后EditText默认获取聚焦问题
  19. Tensorflow图像操作
  20. 将python自动转换为.exe文件

热门文章

  1. 在linux下,查看一个运行中的程序, 占用了多少内存
  2. 【POJ 3335】 Rotating Scoreboard (多边形的核- - 半平面交应用)
  3. pointcut 表达式的含义
  4. Qt: 访问容器(三种方法,加上for循环就四种了)good
  5. Mac与Linux的一个巨大不同
  6. Android:@id和@+id
  7. JS选中OPTION
  8. Servlet入门案例
  9. java事务管理(二)
  10. 在VS中让一个JS文件智能提示另一个JS文件中的成员