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
相关产品推荐
相关产品推荐

