返回

Android 13音频录制适配指南:让您的应用轻松录音

Android

在 Android 13 中,音频录制机制发生了一些变化,开发者需要进行适配才能保证应用的录音功能正常运行。本指南将详细介绍 Android 13 音频录制适配的关键点,并提供代码示例和操作步骤,帮助开发者快速上手。

一、Android 13 音频录制适配核心要点

Android 13 引入了一些新的权限和 API,以增强用户隐私和数据安全。开发者需要关注以下几个方面:

  • 运行时权限: 即使在 Manifest 文件中声明了录音权限,在 Android 13 上仍然需要在运行时动态申请麦克风权限。
  • 存储权限: Android 13 对存储权限的管理更加精细,应用需要请求特定的存储权限才能访问音频文件。
  • 文件路径: 建议使用MediaStore API 或应用专属目录来保存录音文件,避免直接访问外部存储,以提升应用兼容性和安全性。

二、分步骤实现 Android 13 音频录制适配

以下步骤将指导您完成 Android 13 音频录制适配:

  1. 声明权限:AndroidManifest.xml 文件中声明必要的权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />  <!--  读取媒体音频 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="32" />
<!--如果要适配 API 33+,需要在manifest中指定允许外部访问。 这样可以在访问文件时,引导用户跳转至DocumentsUI 选择对应目录-->

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
  1. 动态申请权限: 在代码中动态申请麦克风权限及媒体读取权限:
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_AUDIO)!=PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_MEDIA_AUDIO}, REQUEST_RECORD_AUDIO_PERMISSION);
} else {
    // 已经获得权限,开始录音
    startRecording();
}
  1. 处理权限请求结果:onRequestPermissionsResult 回调方法中处理用户的权限授权结果。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_RECORD_AUDIO_PERMISSION) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户授予了权限,开始录音
            startRecording();
        } else {
            // 用户拒绝了权限,处理相应逻辑,例如提示用户
        }
    }
}

  1. 使用 MediaRecorder 录制音频:
private void startRecording() {
    mediaRecorder = new MediaRecorder();
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mediaRecorder.setOutputFile(getRecordingFilePath()); //  使用合适的路径,见下文
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

    try {
        mediaRecorder.prepare();
        mediaRecorder.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
  1. 获取录音文件路径: 为了更好的兼容性和安全性,建议使用以下方法获取录音文件路径:
  • MediaStore API (Android 10 及以上): 使用 MediaStore API 将录音文件保存到公共媒体目录,方便其他应用访问。
  • 应用专属目录: 将录音文件保存到应用专属的内部存储目录中,提高数据安全性。
// 使用应用专属目录保存音频文件
private String getRecordingFilePath() {
    String fileName = "recording_" + System.currentTimeMillis() + ".mp4";
    File directory = getExternalFilesDir(Environment.DIRECTORY_MUSIC);
    File file = new File(directory, fileName);
    return file.getAbsolutePath();

}

三、额外安全建议

为了进一步提升应用的安全性,建议开发者考虑以下几点:

  • 最小化权限: 只申请应用必需的权限,避免过度请求权限。
  • 及时释放资源: 在录音完成后,及时释放 MediaRecorder 对象占用的资源。
  • 文件访问控制: 限制录音文件的访问权限,防止其他应用未经授权访问敏感数据。

通过遵循以上步骤和建议,开发者可以轻松地适配 Android 13 的音频录制机制,并确保应用在不同 Android 版本上的兼容性和稳定性。