我正在使用MediaRecorder构建录音机,我想重命名创建的文件(因为createTempFile会在文件名中添加一个长的随机数)
所以我的主要步骤是:
// I get the files on the directory I'm writing and the amount of files + 1
File f = new File(myDirectory.toString());
File file[] = f.listFiles();
String fileNumber = String.valueOf(file.length+1);
try {
// I create the temp file to record
audiofile = File.createTempFile("record-"+fileNumber, ".3gp", myDirectory);
} catch (IOException e) {
Log.e(TAG, "sdcard access error");
return;
}
// START THE RECORDER
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(audiofile.getAbsolutePath());
recorder.prepare();
recorder.start();
当用户点击停止按钮时,我在directoy中添加文件
values.put(MediaStore.Audio.Media.TITLE, audiofile.getName());
values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current / 1000));
values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp");
values.put(MediaStore.Audio.Media.DATA, audiofile.getAbsolutePath());
ContentResolver contentResolver = getContentResolver();
Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Uri newUri = contentResolver.insert(base, values);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, newUri));
Toast.makeText(this, "Successfully added file in " + recordedDirectory+audiofile.getName(), Toast.LENGTH_LONG).show();
问题是文件被命名为例如“记录3824925563.3gp”
在保存TempFile或阻止createTempFile()添加随机数之前,有没有重命名TempFile?或任何其他解决方案来实现这一目标?
我尝试创建一个新文件,然后将.renameTo(newFile)转换为我的音频文件,但这不起作用。
编辑: 正如迈克尔所建议的,我尝试使用我想要的参数创建一个新文件并重命名
File AudioFile = new File(myDirectory+"/record-"+fileNumber+".3gp");
AudioFile.createNewFile();
audiofile.renameTo(AudioFile);
哪个没有错误。但文件最终附加了相同的随机数
编辑2:
根据jboi的回答,这很有效,我正在添加我使用的最终代码。我创建了文件,以便在我最终的MediaStore函数上引用它。
File f = new File(myDirectory.toString());
File file[] = f.listFiles();
int fileNumber = file.length+1;
audiofile = new File(String.format(Locale.US, "%s%crecord-%08d.3pg",
quickrecorderDirectory, File.separatorChar, fileNumber));
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(audiofile.getAbsolutePath());
答案 0 :(得分:1)
您可以跳过创建临时文件的步骤。如果在开始录制和停止之间发生任何事情(用户取消,设备关闭,应用程序崩溃,......),那么您可以在以后的内务处理任务中整理出文件碎片和损坏的文件。
所以,我会开始直接录制到最终文件中。该文件的文件编号为+ 1,为8位数字,前导零:
// I get the files on the directory I'm writing and the amount of files + 1
File f = new File(myDirectory.toString());
File file[] = f.listFiles();
int fileNumber = file.length+1;
// START THE RECORDER
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(
String.format(Locale.US, "%s%crecord-%08d.3pg",
myDirectory, File.separatorChar, fileNumber));
try {
recorder.prepare();
} catch(IOException e) {
Log.e(TAG, "error while preparing recording", e);
// You might want to inform the user too, with a Toast
return;
}
recorder.start();
停止并通知媒体播放器也很简单:
recorder.stop();
recorder.release();
// Here comes all your code to inform Media scanner
最后,您需要一些内务处理,检查目录中的不完整文件并删除它们。它可以在每个启动onCreate()
上运行。要确定文件是否完整,您可能已经在使用数据库。在此数据库中,您可以跟踪所有已知文件名(记录停止时insert
)并将文件与数据库进行比较。