android - 将文件复制到/从外部存储

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

我是 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);
}

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

谢谢!我真的很感谢为此类主题提供如此丰富的资源。

最佳答案

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

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

有效的是[此处][2] 的解释方式。 基本上,只需将唯一 ID 作为可选参数之一发送到 synthesizeToFile()。 然后,在您的 Activity 中实现 TextToSpeech.OnUtteranceCompletedListener 接口(interface)并覆盖 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

关于android - 将文件复制到/从外部存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8087226/

相关文章:

google-apps-script - 谷歌应用程序脚本: response "audioContent" from GCP text-to-speech coming back as text file

android - 在 Playstore 上上传应用程序后,Firebase 电话身份验证不起作用

android - Android 中的 PJSip

java - 连接Java中的多个音频文件

java - 在 Java 中读取文件并拆分行。

java - 在Java中获取系统 block 大小

ios - 是否可以在 iOS 中使用 TTS

android:如何通过android应用程序调用号码

android - 如何将 View 扩展类的 Canvas 用于 Activity 类?

c++ - 无法在 mac 上使用 qt app 打开文件