2010-06-10 3 views
2

J'ai écrit un logiciel qui utilise le Wifi comme un moyen de connexion Internet possible .. J'ai remarqué cependant, qu'après un certain temps (je devine environ 15-20 minutes) après que l'appareil a passé en mode économie d'énergie (de toute façon quand l'écran est devenu noir) la connexion Wifi sera simplement abandonnée, même si elle est encore utilisée :(Ceci sur un ADP 2 (donc un Google Ion avec Android 1.6) ... I a pu obtenir le journal suivant:?Wifi va dans IDLE

06-10 15:04:27.009: DEBUG/WifiService(72): got ACTION_DEVICE_IDLE 
06-10 15:04:27.069: ERROR/wpa_supplicant(538): Set_key: Wrong Key 
06-10 15:04:27.069: ERROR/wpa_supplicant(538): Set_key: Wrong Key 
06-10 15:04:27.069: ERROR/wpa_supplicant(538): Set_key: Wrong Key 
06-10 15:04:27.069: ERROR/wpa_supplicant(538): Set_key: Wrong Key 
06-10 15:04:27.069: ERROR/wpa_supplicant(538): Set_key: Wrong Key 
06-10 15:04:27.069: VERBOSE/WifiMonitor(72): Event [CTRL-EVENT-STATE-CHANGE id=0 state=8] 
06-10 15:04:27.079: VERBOSE/WifiStateTracker(72): Changing supplicant state: COMPLETED ==> DORMANT 
06-10 15:04:27.079: DEBUG/WifiStateTracker(72): Deconfiguring interface and stopping DHCP 
06-10 15:04:27.099: VERBOSE/WifiMonitor(72): Event [CTRL-EVENT-DISCONNECTED - Disconnect event - remove keys] 
06-10 15:04:27.099: VERBOSE/WifiMonitor(72): Event [CTRL-EVENT-STATE-CHANGE id=-1 state=8] 
06-10 15:04:27.139: WARN/Smack/Packet(169): notify conn break (IOEx), close connection 
06-10 15:04:27.139: DEBUG/Smack(169): [XMPPConn] close connection, notifyClosed=false 
06-10 15:04:27.139: ERROR/MediaPlayer(390): error (1, -17) 
06-10 15:04:27.139: ERROR/MediaPlayer(390): Error (1,-17) 
06-10 15:04:28.109: VERBOSE/WifiMonitor(72): Event [CTRL-EVENT-DRIVER-STATE STOPPED] 
06-10 15:04:28.129: VERBOSE/WifiStateTracker(72): New network state is DISCONNECTED 
06-10 15:04:28.129: VERBOSE/WifiStateTracker(72): Changing supplicant state: DORMANT ==> DORMANT 
06-10 15:04:28.189: INFO/MediaUploader(199): No need to wake up 
06-10 15:04:28.189: DEBUG/GpsLocationProvider(72): updateNetworkState available 
06-10 15:04:28.189: DEBUG/GpsLocationProvider(72): NetworkThread wait for 4484259ms 
06-10 15:04:28.289: DEBUG/NetworkLocationProvider(72): onDataConnectionStateChanged 3 
06-10 15:04:28.299: DEBUG/GpsLocationProvider(72): state: CONNECTING apnName: iinternet reason: null 
06-10 15:04:32.979: DEBUG/NetworkLocationProvider(72): onDataConnectionStateChanged 3 
06-10 15:04:33.029: DEBUG/GpsLocationProvider(72): state: CONNECTED apnName: iinternet reason: null 
06-10 15:04:33.099: DEBUG/GpsLocationProvider(72): updateNetworkState available 
06-10 15:04:33.099: DEBUG/GpsLocationProvider(72): NetworkThread wait for 4479355ms 
06-10 15:04:33.129: INFO/MediaUploader(199): No need to wake up 
06-10 15:04:33.299: INFO/ActivityManager(72): Stopping service: com.android.mms/.transaction.TransactionService 
06-10 15:04:33.339: ERROR/TransactionSettings(156): Invalid APN setting: MMSC is empty 
06-10 15:04:33.419: INFO/ActivityManager(72): Stopping service: com.android.providers.downloads/.DownloadService 
06-10 15:04:38.309: DEBUG/dalvikvm(199): GC freed 301 objects/19232 bytes in 92ms 
06-10 15:04:43.349: DEBUG/dalvikvm(216): GC freed 1430 objects/84920 bytes in 121ms 
06-10 15:04:48.319: DEBUG/dalvikvm(156): GC freed 323 objects/15152 bytes in 96ms 

est-ce une sorte de bug connu/fonction Si oui, comment la contourner aussi est-il someway à fait intercepter cet événement et puis soimehow Ignor e-t-il ou re-configurer une connexion wifi? Merci d'avance

+1

Il s'agit donc probablement d'une fonction d'économie d'énergie, alors vous ne voulez pas que le wifi tombe ou que le téléphone ne passe pas en mode veille. Peut vouloir vérifier dans les serrures de sillage. –

+1

Les utilisateurs peuvent définir "Stratégie de veille Wi-Fi" via Paramètres/Sans fil et réseaux/Paramètres Wi-Fi/appuyez sur Menu/Avancé/Stratégie de veille Wi-Fi. Les options sont "Lorsque l'écran s'éteint", "Jamais quand branché" et "Jamais". Pour résumer: oui, c'est une fonctionnalité: D –

Répondre

4

Vous devez créer un verrou wifi. Voici comment faire:

WifiManager wifimanager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); 
WifiLock lock = wifimanager.createWifiLock("my_lock"); 

lock.acquire(); 

// your code here 

lock.release(); 

Notez que vous ne devez créer un verrou wifi lorsque vous utilisez activement wifi (à savoir le téléchargement d'un fichier volumineux), sinon vous aura un impact sur la vie inutilement la batterie.

+0

hhmm dois-je vérifier si une connexion wifi est disponible/paramétrée au préalable ou puis-je simplement placer un verrou et s'il n'y a pas de connexion wifi l'API s'en chargera ? – TiGer

+0

Bonne question. Les docs ne le mentionnent pas, mais j'imagine que le verrou n'a aucun effet quand il n'y a pas de connexion wifi. – ian

0

Je reçois une exception SecurityException lorsque j'appelle WifiLock.acquire(). Ai-je manqué une autorisation d'utilisation dans mon manifeste ou y a-t-il quelque chose que je dois vérifier au préalable dans le code? Je suppose que cela a à voir avec les paramètres avancés dans la page de paramètres wifi réglée sur JAMAIS.

+2

ur va avoir besoin: TiGer

+0

Merci, je vais essayer ce soir et que tout le monde sache comment ça se passe. Cela ressemble à ce que je cherchais quand même. –

+0

Cela a fonctionné. En ajoutant les autorisations ACCESS_WIFI_STATE et WAKE_LOCK au manifeste, j'utilise la méthode WifiLock.acquire() sans exception. Maintenant, mon application peut diffuser de la musique sur le wifi aussi longtemps que vous le souhaitez avec l'écran verrouillé. Merci! –

0

L'obtention d'un verrou Wi-Fi n'est pas la solution préférée. L'intention du verrou Wi-Fi est de ne le conserver que lorsque vous accédez activement au réseau, c'est-à-dire de télécharger un fichier. Par exemple. Skype et Google HangOut ne prennent pas et ne conservent pas le verrou Wi-Fi. Vous êtes censé faire ce que Martin Molnar a dit dans son commentaire ci-dessus. Vous êtes supposé laisser l'utilisateur décider s'il veut autoriser son appareil (et votre application sur son appareil) à rester connecté au Wi-Fi lorsque l'écran est éteint via le réglage «WiFi réveillé en veille». Si vous insistez sur le fait que votre App devrait conserver le Wi-Fi même 15min après que l'écran soit éteint, même si l'utilisateur a réglé "WiFi réveillé en veille" sur "non", alors vous êtes supposé prendre le verrouillage de réveil partiel. Encore une fois, Skype ne prend pas le verrou de réveil partiel.

Si vous voulez vraiment avoir une application lisse qui peut recevoir des données/notifications de manière asynchrone, vous devez configurer les notifications push GCM.