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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 !