PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → Mesure du niveau sonore sous Android
Mesure du niveau sonore sous Android
Débuté par Julien, 01 avr. 2020 12:27 - 10 réponses
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 :(