MediaRecorder - fichier son vide
Bonjour à tous,
Depuis pas mal de temps, j'essai d'intégrer un module d'enregistrement vocal à une application. Voici l'activity que j'utilise...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
import java.io.File;
import java.io.IOException;
import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
public class EnrNoteVocaleActivity extends Activity {
TextView statut;
int enregistre = 0; // Mouchard... 0: En attente, 1: Enregistre, 2: Enregistrement terminé
MediaRecorder enregistreur;
EditText nomFichier;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.enregistrement_note_vocale);
statut = (TextView)findViewById(R.id.state); // Affiche simplement l'état de l'enregistrement
Button boutonQuitter = (Button) findViewById(R.id.closeButton);
final ImageButton enregistrer = (ImageButton)findViewById(R.id.recordButton); // Toggle enregistrer... stop
nomFichier = (EditText) findViewById(R.id.newVocalNoteEditText); // Saisi par utilisateur
statut.setText(R.string.en_attente_);
enregistreur = new MediaRecorder();
// ******************** Méthodes de contrôle ********************
boutonQuitter.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
// Un appui sur le bouton nous fait quitter l'activité et stop l'enregistrement s'il tourne encore
/* if (enregistre == 1) { // On ferme la fenêtre tandis qu'on enregistre encore
arreterEnr();
}*/
finish();
}
});
enregistrer.setOnClickListener(new OnClickListener() {
// Fonction de l'enregistrement de la note vocale
public void onClick(View v) {
if (enregistre == 0) { // 0: en attente, 1: Enregistre, 2: Enr. terminé
String nomNote = new String(nomFichier.getText().toString());
boolean fichierValide = NoteDroidActivity.gestFichiers.validerFichier(nomNote); // On valide que le fichier est conforme dans singleton de gestion de fichiers
if (fichierValide) {
enregistre = 1; // mouchard = on enregistre
statut.setText(R.string.enregistre_); // Message à l'utilisateur "On enregistre"
enregistrer.setImageResource(R.drawable.micro_rouge); // Affiche bouton d'arrêt
enregistrerNote(nomNote); // Fonction d'enregistrement
}
else {
finish(); // Si fichier non valide, on ferme l'activity et on affiche l'alertDialog sous-jacent affiché par
// NoteDroidActivity.gestFichiers.validerFichier(nomNote)
}
}
else if (enregistre == 1) { // Si on est en train d'enregistrer
enregistre = 2; // Mouchard 2 = enr terminé (empêche de réactiver le bouton... évite plantage)
statut.setText(R.string.termin_); // Message "terminé"
enregistrer.setImageResource(R.drawable.micro_blanc); // micro_blanc = bouton inactif
arreterEnr(); // On appelle la fct d'arret
NoteDroidActivity.gestAffichage.afficherFichiers(); // Mise à jour de la liste des fichiers
}
}
});
}
// ******************** Méthodes métier ********************
public void enregistrerNote(String fileName) {
enregistreur.setAudioSource(MediaRecorder.AudioSource.MIC);
enregistreur.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
enregistreur.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
// DossierCourant == getExternalFilesDir(null).getAbsolutePath();
enregistreur.setOutputFile(NoteDroidActivity.gestFichiers.getDossierCourant() + File.separator + fileName +".3gp");
try {
enregistreur.prepare();
} catch (IOException e) {
// On affiche le message d'erreur dans une boite de dialogue personnalisée
NoteDroidActivity.gestAffichage.alertDialogAvertissement(getString(R.string.erreur_), e.getLocalizedMessage(), getString(R.string.fermer), null, getResources().getDrawable(R.drawable.exclamation));
}
enregistreur.start();
}
public void arreterEnr() {
enregistreur.stop();
enregistreur.release();
}
@Override
public void onPause() {
super.onPause();
if (enregistre == 1) {
arreterEnr();
enregistre = 0;
}
}
} |
Le singleton de gestion de fichiers de mon application vérifie, avant de donner le dossier courant à cette activité, si un média externe est disponible. Si oui le dossier courant est le dossier externe de mon application, sinon c'est le dossier Data/data/files...
Pas de problème de ce côté là. En fait le fichier son est bien créé dans le bon dossier avec le bon nom. Donc la gestion de fichier ne semble pas être le problème. Par contre, lors de mes tests sur un appareil Android ICS, le fichier 3gp enregistré est vide, bien qu'existant (0 byte). La tablette a pourtant un micro et fonctionne avec d'autres applications sonores. Il faut aussi noter que les permissions d'enregistrement sonore et d'enregistrement sur support externe ont été activées...
Pourriez-vous, SVP, m'aider à résoudre ce mystère ? Merci à l'avance !