【问题标题】:Copying a file to/from external storage将文件复制到/从外部存储
【发布时间】:2011-12-26 14:21:00
【问题描述】:

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

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

谢谢!对于此类主题,我非常感谢这样一个很棒的资源。

【问题讨论】:

  • 看来问题不在于写入新文件,而在于从使用 TextToSpeech.synthesizeToFile() 创建的文件中读取。我似乎无法正确读取此文件。我无法复制它(无论是手动还是以编程方式)。真奇怪。有没有人成功使用过 TextToSpeech.synthesizeToFile()?

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


【解决方案1】:

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

我试图在调用[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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢 riotopsys 的回复。我的清单中确实有 WRITE_EXTERNAL_STORAGE 权限。我也尝试过读取和写入字节的旧方法,但得到的结果与使用 FileUtils.copyFile() 方法时相同,目标文件为空。
    • 您是否尝试过使用getExternalFilesDir 检索您的存储目录?
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 2014-06-12
    • 2013-03-17
    相关资源
    最近更新 更多