1

我对 Android 相当陌生,并且正在写入某个文件。我要做的是使用 TextToSpeech.synthesizeToFile() 方法来编写音频文件。这是有效的,除了当应用程序退出时 TextToSpeech 引擎会自动删除它创建的文件。所以我然后尝试在另一个目录中复制创建的文件。为此,我使用了 org.apache.commons.io.FileUtils 包的 copyFile() 方法。使用此方法只会导致新创建的文件大小为 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);
}

关于我可以尝试什么的任何想法?到目前为止,我没有发现任何东西对我有很大帮助。

谢谢!对于这样的主题,我真的很感激这样一个很棒的资源。

4

2 回答 2

2

啊哈,我终于明白了。当然,这很有意义。

我试图在调用 [1] 后立即复制该文件[synthesizeToFile()],因此该文件尚未完成合成/创建。因此0字节文件大小。

有效的是[这里][2]的解释方式。基本上,只需将唯一 IDsynthesizeToFile()作为可选参数之一发送。然后,TextToSpeech.OnUtteranceCompletedListener在您的活动中实现接口并覆盖onUtteranceCompleted()回调方法。

onUtteranceCompleted()当话语完成合成时,当然会调用它。您可以检查您之前传入的唯一 ID,以区分您可能正在等待完成的多个话语之间的区别。

相当标准的东西,我猜,但出于某种原因,它逃避了我几天。

希望这可以帮助其他可能被卡住的人。

[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

于 2011-11-17T01:01:44.663 回答
0

你试过这种老派的方法吗?

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权限在您的清单中。

于 2011-11-11T02:54:32.830 回答