Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Flash/Flex > Flex
Flex Forum d'entraide sur la programmation Adobe Flex : applications Internet riches (RIA)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/10/2011, 10h34   #1
Invité de passage
 
Inscription : septembre 2007
Messages : 30
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 30
Points : 2
Points : 2
Par défaut Détecter si l'utilisateur a autorisé l'accès au microphone

Bonjour à tous,

Mon projet actuel a besoin d'accéder au micro et à la caméra de l'utilisateur. J'aimerais donc détecter si j'ai les autorisations nécessaires.

Je me suis donc basé sur cet exemple :

http://help.adobe.com/en_US/FlashPla...xamplesSummary

Afin de vérifier si mon code était valide, j'ai fait un petit projet spécifique, pour tester :

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
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
               initialize="init(event)">
    <fx:Declarations>
        <!-- Placer ici les éléments non visuels (services et objets de valeur, par exemple). -->
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import mx.events.FlexEvent;
 
            private var mic:Microphone;
 
            protected function init(event:FlexEvent):void
            {
                mic = Microphone.getMicrophone();
                if (mic != null) {
                    mic.addEventListener(StatusEvent.STATUS, statusEventHandler);
                    if (mic.muted) {
                        Security.showSettings(SecurityPanel.PRIVACY);
                    }
                }
            }
 
            private function statusEventHandler(statusEvent:StatusEvent):void {
                Alert.show(statusEvent.code, "StatusEvent");
            }
 
        ]]>
    </fx:Script>
 
</s:Application>
Ici, j'ai bien le comportement attendu :
- je détecte que je n'ai pas encore l'autorisation d'accéder au micro
- j'affiche la fenêtre de "paramètres"
- je reçois l'event dans mon handler.

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
119
120
121
122
123
124
125
126
127
128
129
130
131
<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
	xmlns:mx="http://www.adobe.com/2006/mxml"
	xmlns:ctrl="com.flashphoner.api.communication.*" 
	xmlns:click2call="com.flashphoner.click2call.views.*"
	width="240" height="520" initialize="init()" layout="absolute" verticalScrollPolicy="off" horizontalScrollPolicy="off"
	backgroundAlpha="0">
 
    <mx:Style source="styles/style.css"/>
    <mx:Script>
        <![CDATA[
			import com.adobe.cairngorm.control.CairngormEventDispatcher;
			import com.flashphoner.Logger;
			import com.flashphoner.api.Flash_API;
			import com.flashphoner.api.data.PhoneConfig;
			import com.flashphoner.api.management.SoundControl;
			import com.flashphoner.click2call.APINotifyClick2Call;
			import com.flashphoner.click2call.DataClick2Call;
			import com.flashphoner.click2call.LabelValue;
			import com.flashphoner.click2call.statemachine.CallStateMachineManager;
			import com.flashphoner.click2call.statemachine.CallTransitionEvent;
			import com.flashphoner.click2call.views.VersionView;
 
			import mx.controls.Alert;
			import mx.events.FlexEvent;
			import mx.managers.PopUpManager;
			import mx.utils.ObjectUtil;
 
			private static const VERSION_NUMBER:String = "0.9-snapshot";
 
        	private var count:int=0;    
 
			private var versionView:VersionView;
			private var callStateMachine:CallStateMachineManager = new CallStateMachineManager();
			private var apiNotify:APINotifyClick2Call = new APINotifyClick2Call();
 
			private var mic:Microphone;
 
        	private function init():void
        	{	
				Logger.info("Starting click2call - current version : " + VERSION_NUMBER);
 
        		DataClick2Call.getInstance().flash_API.addAPINotify(apiNotify);
				DataClick2Call.getInstance().phoneButtonLabel = phoneButtonLabel;
				DataClick2Call.getInstance().videoButtonLabel = videoButtonLabel;
				DataClick2Call.getInstance().videoView = videoView;				
 
				//show logger window if debug mode
				if (parameters.hasOwnProperty("debug")) {
					loggerTextArea.visible = true;
				} else {
					loggerTextArea.visible = false;
				}
 
				if (parameters.hasOwnProperty("contactName")) {
					DataClick2Call.getInstance().contactName = parameters.contactName;
					DataClick2Call.getInstance().phoneButtonLabel.text = DataClick2Call.getInstance().contactName;
				}
				if (parameters.hasOwnProperty("enableVideo")) {
					var enableVideoString:String = parameters.enableVideo as String;
					Logger.info("enableVideo as String value : "+ enableVideoString);
					var enableVideo:Boolean = false;
					if (enableVideoString == "true") {
						enableVideo = true;
					}
					Logger.info("enableVideo value : "+ enableVideo);
 
					videoButtonLabel.visible = enableVideo;
					videoButton.visible = enableVideo;
				}
				// adding listeners to callEvent
				addEventListener(CallTransitionEvent.AUDIO_CLICK, callStateMachine.stateEval);
				addEventListener(CallTransitionEvent.CONNECTED, callStateMachine.stateEval);
				addEventListener(CallTransitionEvent.RINGING, callStateMachine.stateEval);
				addEventListener(CallTransitionEvent.BUSY, callStateMachine.stateEval);
				addEventListener(CallTransitionEvent.OK, callStateMachine.stateEval);
				addEventListener(CallTransitionEvent.FINISH, callStateMachine.stateEval);
				addEventListener(CallTransitionEvent.ERROR, callStateMachine.stateEval);
				addEventListener(CallTransitionEvent.DISCONNECTED, callStateMachine.stateEval);
				addEventListener(CallTransitionEvent.VIDEO_CHANGED, callStateMachine.stateEval);
				addEventListener(CallTransitionEvent.VIDEO_CLICK, callStateMachine.stateEval);
				addEventListener(CallTransitionEvent.VIDEO_TIMEOUT, callStateMachine.stateEval);
 
				// test microphone - display security panel if muted
				mic = Microphone.getMicrophone();
				if (mic != null) {
					mic.addEventListener(StatusEvent.STATUS, microphoneStatusEventHandler);
					if (mic.muted) {
						Security.showSettings(SecurityPanel.PRIVACY);
					}
				}
 
        	}      	 
 
			private function microphoneStatusEventHandler(statusEvent:StatusEvent):void {
				Logger.debug("microphoneStatusEventHandler : "+ ObjectUtil.toString(statusEvent)); 
			}
 
			private function onOpenMicrophoneSettingsView():void{
        		SoundControl.getInstance().getMicrophone().setLoopBack(true);
        		PopUpManager.addPopUp(DataClick2Call.getInstance().microphoneSettingsView,this);
        		//PopUpManager.centerPopUp(DataClick2Call.getInstance().microphoneSettingsView);
 
        	}        	
 
 
        ]]>       
    </mx:Script>  
	<!-- Grey : [#ababab, #c4c4c4] -->
<mx:Panel width="100%" height="100%" layout="absolute" cornerRadius="0" backgroundAlpha="0">
	<click2call:PhoneButton id="phoneButton" x="12" y="59" width="150" height="35" cornerRadius="5"/>
	<mx:Label id="phoneButtonLabel" x="12" y="100" width="150" textAlign="center" fontSize="12" visible="true" fontWeight="normal" color="#FFFFFF"/>
 
	<mx:Button x="174" y="59" width="35" height="35" alpha="0.65" borderColor="#C1CFE1"
			   click="onOpenMicrophoneSettingsView()" cornerRadius="5" fillAlphas="[1.0, 1.0]"
			   fillColors="[#DEEEFF, #A5CCFF, #B7DBFF, #4A8ACB]" fontSize="10" themeColor="#86A3C1"
			   toolTip="Mic settings" icon="@Embed(source='/assets/parameters.png')"/>
 
 
 
	<click2call:VideoButton id="videoButton" x="12" y="137" width="150" height="35" label="Vidéo" cornerRadius="5" toolTip="Open video window"/> 
	<mx:Label id="videoButtonLabel" x="12" y="175" width="150"  textAlign="center" fontSize="12" visible="true" fontWeight="normal" color="#FFFFFF"/>
	<click2call:VideoView id="videoView" visible="false" x="12" y="200"/> 
 
	<!--  Logger -->
	<mx:TextArea id="loggerTextArea" x="5" y="215" horizontalCenter="true" width="230" height="300" editable="false" verticalScrollPolicy="auto" text="{Logger.log}"/> 
 
</mx:Panel>
 
 
</mx:Application>
J'ai donc repris le code, et je l'ai injecté dans mon projet actuel.

Cependant, dans cette configuration, je ne reçois pas le StatusEvent quand je clique sur la case "autoriser" dans les paramètres.

En utilisant le débuggeur, j'ai vu que :
- sans breakpoint, impossible d'entrer dans microphoneStatusEventHandler.
- quand je met un breakpoint, l'application rentre dans microphoneStatusEventHandler avant même d'afficher le log initial (Logger.info("Starting click2call - current version : " + VERSION_NUMBER)). Tant que le breakpoint reste activé, je reviens toujours dans le handler. Si je le désactive, l'application s'exécute normalement.

Je ne sais pas trop d'où provient ce comportement, donc si quelqu'un a une piste, je suis preneur.

Mon player flash est le 11.0.1.152 , sous windows seven.

Merci d'avance.
Museum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 11h57   #2
Rédacteur/Modérateur
 
Avatar de Jim_Nastiq
 
Homme Jean-Marie Macé
Ingénieur consultant, leader Flex
Inscription : avril 2006
Messages : 2 194
Détails du profil
Informations personnelles :
Nom : Homme Jean-Marie Macé
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur consultant, leader Flex
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 194
Points : 3 377
Points : 3 377
Salut,

déjà ton appli de test est sous Flex 4 ou supérieur alors que ton appli cible est en 3 (cf. mx:Application / s:Application).
Histoire d'être certains, d'avoir le meme environnement de test fait la modif

Pour le reste, je t'avoue que c'est difficile de diagnostiquer à distance au vu de ce que tu évoques.
__________________

Pensez vraiment à effectuer une recherche avant de poster, ici et sur un moteur de recherche! c'est la moindre des choses
Pensez au tag

Mon Blog sur la techno Flex
Ma page sur Developpez.com

Jim_Nastiq
Jim_Nastiq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 15h01   #3
Invité de passage
 
Inscription : septembre 2007
Messages : 30
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 30
Points : 2
Points : 2
Merci pour ta réponse.

Je viens de modifier mon appli de test, et ça marche aussi avec mx:application.

EDIT :

Un appel de la fonction willTrigger sur mic (mon microphone), m'indique que j'ai bien un eventListener sur StatusEvent.STATUS, mais je n'ai pas d'événement de ce type qui est dispatché par le security panel (comme indiqué dans la doc).

Pour le moment, j'ai mis en place un timer (pas très joli donc) qui rappelle mon listener.

Y a t'il un moyen de savoir si un événement est lancé ? Idéalement, j'aimerais savoir à l'aide du débuggueur si j'ai un StatusEvent.STATUS.

Enfin, je m'aperçois que j'ai une référence vers Caingorm dans mon projet (vive la reprise de l'existant). Je ne connais pas le framework, peut il y avoir une interférence ?
Museum est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h38.


 
 
 
 
Partenaires

Hébergement Web