Копирование файла в / из внешнего хранилища - PullRequest
1 голос
/ 11 ноября 2011

Я довольно новичок в Android и пишу в определенный файл. Я пытаюсь использовать метод TextToSpeech.synthesizeToFile () для записи аудиофайла. Это работает за исключением того факта, что при выходе из приложения механизм TextToSpeech автоматически удаляет созданный файл. Поэтому я попытался скопировать созданный файл в другой каталог. Для этого я использую метод copyFile () пакета org.apache.commons.io.FileUtils. Использование этого метода приводит только к вновь созданному файлу размером 0. Я использую Environment.getExternalStorageDirectory (), чтобы получить соответствующий каталог внешнего хранилища. Я попытался записать в существующий каталог, такой как / mnt / sdcard / Ringtones /, а также во вновь созданный каталог в /mnt/sdcard/...

Еще одна вещь, которую я проверял, была результатом File.canWrite () в конечном файле. Это на самом деле возвращает false, что может быть подсказкой. Но метод File.setWritable (), по-видимому, не существует, чтобы изменить это.

Я использую код, подобный следующему, и я не видел никаких исключений

try {
    File from = new File(tempDestFile);
    File to = new File(permDestFile);
    FileUtils.copyFile(from, to);
} catch(IOException e) {
    Log.e(T, "Error copying file", e);
} catch(NullPointerException e) {
    Log.e(T, "Error copying file", e);
}

Есть идеи, что я могу попробовать? Ничто из того, что я нашел, пока не помогло мне в этом.

Спасибо! Я действительно ценю такой замечательный ресурс по таким темам.

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Ага, я наконец-то понял. И, конечно, это имеет смысл.

Я пытался скопировать файл сразу после вызова [synthesizeToFile()] [1], и поэтому файл не был завершен, был преобразован / создан. Отсюда 0 размер файла байтов.

Что работает, так это то, как это объясняется [здесь] [2]. По сути, просто отправьте уникальный идентификатор на synthesizeToFile() в качестве одного из необязательных параметров. Затем внедрите интерфейс TextToSpeech.OnUtteranceCompletedListener в свою деятельность и переопределите метод обратного вызова onUtteranceCompleted().

onUtteranceCompleted() тогда, конечно, вызывается, когда высказывание заканчивается синтезом. Вы можете проверить уникальный идентификатор, который вы передали ранее, чтобы определить разницу между несколькими высказываниями, которые вы, возможно, ожидаете до конца.

Полагаю, довольно стандартный материал, но по какой-то причине он уклонился от меня на несколько дней.

Надеюсь, это поможет кому-то еще, кто может застрять.

[1]:

http://developer.android.com/reference/android/speech/tts/TextToSpeech.html#synthesizeToFile%28java.lang.String,%20java.util.HashMap%3Cjava.lang.String,%20java.lang.String%3E,%20java.lang.String%29
[2]:

http://developer.android.com/resources/articles/tts.html

0 голосов
/ 11 ноября 2011

вы пробовали этот метод старой школы?

FileInputStream fis = new FileInputStream(tempDestFile);
FileOutputStream fos = new FileOutputStream(permDestFile);
byte[] bites= new byte[1024];
int count = fis.read(bites);
while (  count != -1){
    fos.write(bites, 0, count);
    count = fis.read(bites);            
}

и убедитесь, что разрешение WRITE_EXTERNAL_STORAGE присутствует в вашем манифесте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...