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更简单,还能避免文件名里出现特殊字符导致创建失败。
额外提醒:
- 不用申请存储权限:访问内部存储不需要
READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限,省掉了权限申请的麻烦。 - 录音结束时机:你原来的代码里
start()之后马上stop(),这等于录了个空文件,得把stop()放在用户触发停止的地方,比如按钮点击事件或者定时任务里。 - Service里的注意事项:如果是在Service中运行录音,记得在服务的
onDestroy()方法里释放MediaRecorder资源,不然容易内存泄漏。
这样改完之后,你的录音文件就安安全全待在应用的私有地盘里,别人根本碰不到,完全符合你的要求!
内容的提问来源于stack exchange,提问作者Mugirase Emmanuel
相关产品推荐
相关产品推荐

