2013-11-26 2 views
2

Я строй аудио-рекордер с помощью MediaRecorder, и я хочу, чтобы переименовать созданный файл (потому что createTempFile добавляет длинное случайное число к имени файла)Как переименовать временный файл, используемый в mediarecorder?

Так что мои основные шаги:

// 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(); 

Проблема в том, что файлы получили имя, например, "record-3824925563.3gp"

Следует ли вообще переименовать TempFile перед сохранением или предотвратить добавление случайного числа createTempFile()? Или любое другое решение для достижения этого?

Я попытался создать новый файл, а затем лить .renameTo (newFile) в свой аудиофайл, но это не сработало.

EDIT: Как полагает Майкл, я попытался создать новый файл с параметрами, которые я хочу и переименовать его

File AudioFile = new File(myDirectory+"/record-"+fileNumber+".3gp"); 

AudioFile.createNewFile(); 

audiofile.renameTo(AudioFile); 

Что не приводит к возникновению ошибок. Но файлы endup с теми же случайных чисел добавляются

EDIT 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) Вместо 'createTempFile()' вы можете использовать путь и имя файла, которое вы, наконец, хотите (если вы это знаете заранее) 2) Назовите 'renameTo (newFile)' на свой 'audiofile' и он будет иметь имя заданный в 'newFile' (если ошибка не была). Объект «Файл» на самом деле не является файлом, в основном это имя и информация о пути, чтобы обозначить конкретный файл или каталог (существующий или нет). –

+0

Спасибо, Майкл, но я не смог заставить его работать. См. Отредактированный вопрос. – Cruclax

+0

Забудьте имя файла, который вы создаете. Он ненадежен и приведет к ошибкам в многопоточной среде. Какое имя вы, наконец, хотите передать в файл? – jboi

ответ

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 при остановке записи) и сравнивать файлы с базой данных.

+0

Да. Это сработало хорошо! Я отредактирую свой вопрос, чтобы добавить код, который я наконец использовал. Спасибо jboi. – Cruclax

Смежные вопросы