| |
Membre enregistré 5 messages |
|
Posté le 01 avril 2020 - 12:27 |
Bonjour,
Je cherches à mesurer le niveau sonore à l'aide d'un smartphone sous Android, sans faire d'enregistrement.
J'utilise les fonctions de AudioRecord en Java, mais malheureusement l'application me retourne toujours la valeur zéro (le microphone est bien autorisé au niveau du téléphone).
Si l'un d'entre vous à une solution à mon problème je suis preneur.
Merci d'avance.
Ci dessous le code utilisé pour faire la capture. Cette fonction est appelée par un bouton et le résultat est affiché dans un champ de saisie.
import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder;
public static int Test() {
int sampleRateInHz = 8000; int channelconfig = AudioFormat.CHANNEL_IN_STEREO; int audioFormat = AudioFormat.ENCODING_PCM_16BIT; int bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz, channelconfig, audioFormat); AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz, channelconfig, audioFormat, bufferSize); short[] buffer = new short [bufferSize]; recorder.startRecording();
int max = 0; while (recorder.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) { recorder.read(buffer, 0, bufferSize); for(short s : buffer){ max=s; if (Math.abs(s)>max){ max=Math.abs(s); } } recorder.stop(); }
recorder.release(); recorder = null;
return max;
} |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 473 messages Popularité : +20 (20 votes) |
|
Posté le 02 avril 2020 - 17:36 |
Déjà il y a un problème qui saute aux yeux dans ton code à la ligne max=s ; il faut enlever cette ligne et probablement cela devrait aller mieux |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 5 messages |
|
Posté le 02 avril 2020 - 18:45 |
Bonjour stef1811, Effectivement cette ligne n'a rien à faire là, c'est un reliquat d'un ancien test. Il avait pour but de renvoyer la dernière valeur du buffer mais à nouveau le résultat renvoyé était zéro. Sans cette ligne le résultat est le même, la valeur retournée est zéro. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 3 311 messages Popularité : +93 (137 votes) |
|
Posté le 02 avril 2020 - 20:41 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 473 messages Popularité : +20 (20 votes) |
|
Posté le 02 avril 2020 - 20:52 |
Julien a écrit :
Bonjour stef1811, Effectivement cette ligne n'a rien à faire là, c'est un reliquat d'un ancien test. Il avait pour but de renvoyer la dernière valeur du buffer mais à nouveau le résultat renvoyé était zéro. Sans cette ligne le résultat est le même, la valeur retournée est zéro.
Je viens de tester ton code (sans la ligne) et cela fonctionne bien |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 5 messages |
|
Posté le 03 avril 2020 - 11:30 |
Bonjour Popoy, Au début de mes tentatives j'avais effectivement un problème d'autorisation qui m'était renvoyé par "recorder.startRecording();" qui m'indiquait en effet qu'un élément ne s'était pas correctement initialisé. En fouillant sur le forum j'ai trouvé un des liens que tu mentionnes et j'ai donc ajouté les fonctions suivantes :
import android.support.v4.app.ActivityCompat; import android.Manifest;
public static void Set_Permission_Audio() { if (Check_Permission_Audio()==false) { appelProcedureWL("Message_Texte", "Demande permission");
ActivityCompat.requestPermissions(getActiviteEnCours(), new String[]{Manifest.permission.RECORD_AUDIO}, 0); } }
et
import android.support.v4.content.ContextCompat; import android.Manifest; import android.content.pm.PackageManager; import android.os.Build;
public static boolean Check_Permission_Audio() { // Seulement depuis la version 6 // appelProcedureWL("Message_Texte", android.os.Build.VERSION.SDK_INT); //Retourne 29 // appelProcedureWL("Message_Texte", android.os.Build.VERSION_CODES.M); //Retourne 23 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { // Assume thisActivity is the current activity int permissionCheck = ContextCompat.checkSelfPermission(getContexteApplication(), Manifest.permission.RECORD_AUDIO); if (permissionCheck == PackageManager.PERMISSION_GRANTED) { appelProcedureWL("Message_Texte", "Permission Audio autorisée"); return true; } else { appelProcedureWL("Message_Texte", "Permission Audio non autorisée"); return false; } } else { appelProcedureWL("Message_Texte", "Permission Audio non autorisée"); return true; } }
A la fin de l'initialisation de ma fenêtre d’accueil, j’exécute la fonction Set_Permission_Audio() qui me renvoie "Permission Audio autorisée", sachant que j'ai autorisé l'accès au microphone manuellement au niveau du gestionnaire d'application d'Android. Mais là encore la valeur retournée est zéro...
J'utilises Android 10 et API level 29 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 5 messages |
|
Posté le 03 avril 2020 - 11:35 |
Bonjour Stef1811, Je dois passé à coté d'une évidence. J'ai refais le test ce matin (sans la ligne) et à nouveau le code me retourne zéro, peux tu me dire comment tu lis la valeur retournée? Pour ma part j'envoie la valeur retournée dans un champ de saisie (SAI_Message=Test() ) |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 3 311 messages Popularité : +93 (137 votes) |
|
Posté le 03 avril 2020 - 12:20 |
J'ai compris le problème. C'est le fait d'utiliser Android 10. Essaie avec une version plus ancienne de l'api ou essaie avec windev mobile 24 car il y a pas mal de problèmes entre android 10 et wm25. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 5 messages |
|
Posté le 03 avril 2020 - 13:49 |
Merci pour cette piste, je vais essayer de la mettre en oeuvre. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 55 messages Popularité : +4 (4 votes) |
|
Posté le 04 mai 2021 - 08:38 |
Salut,
Je cherche à récupérer le niveau sonore d'un micro (sonométre) as tu réussi à faire fonctionner ton code ? Ou si quelqu'un à une idée de comment faire je suis preneur
merci |
| |
| |
| | | |
|
| | |
| |
Posté le 04 mai 2021 - 09:34 |
Malheureusement non |
| |
| |
| | | |
|
| | |