【问题标题】:How to rename tempfile used in mediarecorder?如何重命名媒体记录器中使用的临时文件?
【发布时间】:2013-12-12 07:37:33
【问题描述】:

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

当用户单击停止按钮时,我将文件添加到目录中

    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() 添加随机数?或任何其他解决方案来实现这一点?

我尝试创建一个新文件,然后将 .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) 代替createTempFile(),您可以使用您最终想要的路径和文件名(如果您事先知道的话) 2) 在您的audiofile 上调用renameTo(newFile),它将具有名称在newFile 中给出(如果没有发生错误)。 File 对象并不是真正的文件,它主要是表示特定文件或目录(是否存在)的名称和路径信息
  • 谢谢迈克尔,但我无法让它工作。请查看已编辑的问题。
  • 忘记您创建的文件编号。它不可靠,并且会在多线程环境中产生错误。你最终想给文件起什么名字?
  • @Cruclax 阅读文档,他们声明 renameTo() 在失败时返回 false,检查一下。无需创建要重命名的文件(这甚至可能是失败的原因)。使用仅大写/小写不同的多个变量名称不是一个好主意。使用以大写字母开头的变量名是违反 Java 约定的
  • @jboi 我想将文件命名为“Record-[fileNumberOnThatFolder+1].3gp”

标签: java android rename mediarecorder temporary-files


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

【讨论】:

  • 是的。效果很好!我将编辑我的问题以添加我最终使用的代码。谢谢jboi。
猜你喜欢
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多