2011-11-10 4 views
1

Je suis relativement nouveau sur Android et je suis en train d'écrire sur un certain fichier. Ce que j'essaie de faire est d'utiliser la méthode TextToSpeech.synthesizeToFile() pour écrire un fichier audio. Cela fonctionne sauf que lorsque l'application se termine, le moteur TextToSpeech supprime automatiquement le fichier créé. J'ai alors essayé de faire une copie du fichier créé dans un autre répertoire. Pour ce faire, j'utilise la méthode copyFile() du package org.apache.commons.io.FileUtils. L'utilisation de cette méthode entraîne uniquement la création d'un fichier de taille 0 nouvellement créé. J'utilise Environment.getExternalStorageDirectory() pour obtenir le répertoire de stockage externe approprié. J'ai essayé d'écrire dans un répertoire existant tel que/mnt/sdcard/Ringtones/ainsi qu'un nouveau répertoire sous/mnt/sdcard/...Copie d'un fichier vers/depuis un stockage externe

Une autre chose que j'ai vérifiée était le résultat de File.canWrite () sur le fichier de destination. Cela retourne réellement faux, ce qui peut être un indice. Mais la méthode File.setWritable() ne semble pas exister pour changer cela.

J'utilise un code tel que ce qui suit et je n'ai vu aucune exception jetés

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

Toutes les idées sur ce que je pourrais essayer? Rien de ce que j'ai trouvé jusqu'à maintenant m'a beaucoup aidé à ce sujet.

Merci! J'apprécie vraiment une telle ressource pour des sujets comme celui-ci.

+0

Il semble que le problème est pas écrit au nouveau fichier, mais à la lecture du fichier créé avec TextToSpeech.synthesizeToFile().Je n'arrive pas à lire correctement ce fichier. Je ne peux pas le copier (ni manuellement ni par programme). C'est étrange. Quelqu'un at-il déjà utilisé avec succès TextToSpeech.synthesizeToFile()? – Trees

Répondre

2

Aha, j'ai enfin compris. Et bien sûr, cela prend tout son sens.

J'essayais de copier le fichier immédiatement après avoir appelé [synthesizeToFile()] [1], et le fichier n'était donc pas fini d'être synthétisé/créé. D'où la taille de fichier 0.

Ce qui fonctionne est la façon dont il est expliqué [ici] [2]. Fondamentalement, il suffit d'envoyer un identifiant unique à synthesizeToFile() comme l'un des paramètres facultatifs. Ensuite, implémentation de l'interface TextToSpeech.OnUtteranceCompletedListener dans votre activité et remplacement de la méthode de rappel onUtteranceCompleted().

onUtteranceCompleted() est alors bien sûr appelée lorsque l'énoncé est fini d'être synthétisé. Vous pouvez vérifier l'ID unique que vous avez transmis plus tôt pour faire la différence entre plusieurs énoncés que vous pourriez attendre pour terminer.

Assez standard, je suppose, mais pour une raison quelconque, il m'a échappé pendant quelques jours.

Espérons que cela peut aider quelqu'un d'autre qui pourrait être coincé.

[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

avez-vous essayé cette méthode old school?

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

et assurez-vous que l'autorisation WRITE_EXTERNAL_STORAGE est dans votre manifeste.

+0

Merci pour la réponse de riotopsys. J'ai l'autorisation WRITE_EXTERNAL_STORAGE dans mon manifeste. J'ai également essayé cette ancienne façon de lire et d'écrire les octets, mais j'ai le même résultat que lorsque j'utilise la méthode FileUtils.copyFile(), un fichier de destination vide. – Trees

+0

Avez-vous essayé d'utiliser [getExternalFilesDir] (http://developer.android.com/reference/android/content/Context.html#getExternalFilesDir (java.lang.String)) pour récupérer votre répertoire de stockage? – riotopsys

Questions connexes