You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Android中如何创建录音用带文件名的FileDescriptor实例

Xamarin Android 环境下为MediaRecorder指定自定义文件名输出的实现方案

问题原因

直接实例化得到的空FileDescriptor对象没有绑定实际文件路径,无法将录音写入指定位置。Java中通过FileOutputStream获取文件描述符的逻辑在Xamarin Android中同样可行,编译失败是因为Xamarin的类型绑定规则不支持隐式类型转换,且需要匹配正确的命名空间。

正确实现步骤

  • 首先指定自定义文件名和存储路径,优先选择应用专属目录,可避免额外的存储权限申请
  • 通过Java.IO.FileOutputStream绑定目标文件,显式读取流的FD属性得到对应FileDescriptor实例
  • 将该FileDescriptor传入SetOutputFile方法即可
  • 录音结束回收资源时,同步关闭文件流,避免句柄泄漏

核心代码示例

// 自定义录音文件存储路径与文件名,示例为应用专属音乐目录
var outputDir = Android.App.Application.Context.GetExternalFilesDir(Android.OS.Environment.DirectoryMusic);
var recordFile = new Java.IO.File(outputDir, "myrecording.ts"); // 此处可自定义文件名
// 创建绑定目标文件的输出流,获取对应的FileDescriptor
using var outputStream = new Java.IO.FileOutputStream(recordFile);
FileDescriptor recordFd = outputStream.FD;
// 传入MediaRecorder
recorder.SetOutputFile(recordFd);

完整录音流程代码

MediaRecorder recorder = new MediaRecorder(this);
// 基础录音配置
recorder.SetAudioSource(AudioSource.Mic);
recorder.SetOutputFormat(Android.Media.OutputFormat.Mpeg2Ts);
recorder.SetAudioEncoder(AudioEncoder.Aac);
// 绑定自定义输出文件
var outputDir = GetExternalFilesDir(Android.OS.Environment.DirectoryMusic);
var recordFile = new Java.IO.File(outputDir, "myrecording.ts");
var outputStream = new Java.IO.FileOutputStream(recordFile);
recorder.SetOutputFile(outputStream.FD);
// 配置录音时长
recorder.SetMaxDuration(10000);
// 启动录音
recorder.Prepare();
recorder.Start();

// 录音停止时执行资源回收(可绑定时长到达回调、停止按钮事件)
recorder.Stop();
recorder.Release();
outputStream.Close();
// 后续可通过 recordFile.AbsolutePath 获取录音文件完整路径,用于播放、校验

注意事项

禁止直接传入无绑定的空FileDescriptor实例:空构造函数生成的FileDescriptor没有关联任何实际文件,会导致录音写入失败、文件无法查找的问题。
不要混淆流类型:必须使用Java.IO.FileOutputStream获取文件描述符,.NET原生的System.IO.FileStream无法直接转换为Android API要求的FileDescriptor类型,会引发类型不兼容错误。

内容的提问来源于stack exchange,提问作者TechGeek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:12:28