将文件复制到外部存储或从外部存储复制

时间:2011-11-10 22:26:00

标签: android file-io text-to-speech file-copying

我对Android很新,并且正在写某个文件。 我想要做的是使用TextToSpeech.synthesizeToFile()方法来编写音频文件。这是有效的,除了当app退出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);
}

关于我可能尝试的任何想法? 到目前为止,我找到的任何东西都没有对我有所帮助。

谢谢!我非常感谢这样一个很好的资源。

2 个答案:

答案 0 :(得分:2)

啊哈,我终于明白了。当然,这很有道理。

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

它的解释方法[这里] [2]。 基本上,只需将唯一ID作为可选参数之一发送到synthesizeToFile()。 然后,在您的活动中实施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

答案 1 :(得分: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权限在您的清单中。