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

Android应用如何将录音保存至私有内部存储

把录音存到应用私有内部存储的解决方案

嘿,我来帮你搞定这个问题!你当前代码用了Environment.getExternalStorageDirectory(),这直接指向了外部存储,所以文件才会被文件管理器看到甚至删除。Android的内部私有存储就是专门用来存放只有自己应用能访问的数据的,完全符合你的需求,而且不需要额外的存储权限,简直完美。

先给你看修改后的完整代码,关键改动我都标出来了:

private MediaRecorder rec;
private String file_folder = "/scholar/";

// 核心改动:换成应用内部存储的路径,这是只有你的应用能访问的私有目录
String file_path = getFilesDir().getAbsolutePath(); 
File file = new File(file_path, file_folder);

// 用时间戳生成文件名,避免特殊字符导致创建失败
long timestamp = System.currentTimeMillis();
String fileName = "_" + timestamp + ".amr";

try {
    rec = new MediaRecorder();
    rec.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
    rec.setAudioChannels(1);
    rec.setAudioSamplingRate(8000);
    rec.setAudioEncodingBitRate(44100);
    
    // 这里你之前犯了个小错误:setOutputFormat要传OutputFormat的常量,不是AudioEncoder的!
    rec.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
    rec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

    // 创建内部存储的文件夹,不需要任何权限
    if (!file.exists()) {
        file.mkdirs();
    }

    // 设置输出文件到内部存储的scholar文件夹里
    String outputFilePath = new File(file, fileName).getAbsolutePath();
    rec.setOutputFile(outputFilePath);

    rec.prepare();
    rec.start();
    
    // 注意!这里的stop()不能直接写在start后面,会导致录音立刻结束!
    // 你得把rec.stop()放在停止录音的触发事件里(比如用户点停止按钮),用完记得release资源
    // rec.stop();
    // rec.release();
} catch (IOException e) {
    e.printStackTrace();
    Toast.makeText(Recording_Service.this, "录音准备失败啦!", Toast.LENGTH_SHORT).show();
} finally {
    // 建议在服务销毁或者不再需要录音的时候释放资源,防止内存泄漏
    if (rec != null) {
        rec.release();
        rec = null;
    }
}

关键改动说明:

  • 替换存储路径:getFilesDir()返回的是/data/data/[你的应用包名]/files/,这个目录是完全私有的,其他应用(包括文件管理器)没有访问权限,卸载应用时系统会自动删掉这里的文件。
  • 修正OutputFormat错误:你之前把AudioEncoder.AMR_NB传给了setOutputFormat(),这会导致录音失败,必须改成OutputFormat.AMR_NB,别搞混了~
  • 资源释放:MediaRecorder是个耗资源的家伙,用完一定要调用release(),不然会占着系统资源,下次录音可能就出问题了。
  • 文件名优化:用System.currentTimeMillis()生成时间戳比Date更简单,还能避免文件名里出现特殊字符导致创建失败。

额外提醒:

  1. 不用申请存储权限:访问内部存储不需要READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限,省掉了权限申请的麻烦。
  2. 录音结束时机:你原来的代码里start()之后马上stop(),这等于录了个空文件,得把stop()放在用户触发停止的地方,比如按钮点击事件或者定时任务里。
  3. Service里的注意事项:如果是在Service中运行录音,记得在服务的onDestroy()方法里释放MediaRecorder资源,不然容易内存泄漏。

这样改完之后,你的录音文件就安安全全待在应用的私有地盘里,别人根本碰不到,完全符合你的要求!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:52:50