如何重命名mediarecorder中使用的tempfile?

时间:2013-11-26 22:27:03

标签: java android rename mediarecorder temporary-files

我正在使用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());

1 个答案:

答案 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)并将文件与数据库进行比较。