2016-10-04 3 views
0

Ich experimentiere mit P2P-Kommunikation auf Android mit WiFi-Direct. Ich habe einen Dienst, der nach anderen Telefonen sucht und sich automatisch mit ihnen verbindet, wenn sie vorher gepaart wurden. Ich mag es, das funktioniert unabhängig davon, ob der Bildschirm ein- oder ausgeschaltet ist.Android: WiFi-Direct-Kommunikation, wenn der Bildschirm ausgeschaltet ist

Android bietet eine Option zum Beibehalten des WLAN, wenn der Gerätebildschirm ausgeschaltet ist. Aber es sieht so aus, als ob WiFi-Direct nicht betroffen ist. Nachdem der Bildschirm des Geräts ausgeschaltet und eine Minute gewartet wurde, scheint die WifiP2pManager keine neuen Peers mehr zu entdecken.

Hat jemand eine Idee, wie Sie dieses Verhalten beheben können?

Antwort

0

Also, was passiert hier ist, dass Sie startDiscoveryProcess() 50 Sekunden nach dem Ausschalten des Bildschirms anrufen und startDiscoveryProcess() ruft sich selbst alle 50 Sekunden. Wie man diesen Prozess stoppt? Sie hören auf Intent.ACTION_SCREEN_ON und wenn der Bildschirm eingeschaltet ist, senden wir die Übertragung nicht, um die Erkennung erneut zu starten.

boolean screenOn = true; 

BroadcastReceiver screenReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF) || intent.getAction().equals("MY_ACTION_WHEN_SCREEN_IS_OFF")) { 
      screenOn = false; 
      new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        // start discovery process again 
        startDiscoveryProcess(); 
       } 
      }, 50000); 
     } else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      screenOn = true; 
     } 
    } 
}; 

In onCreate() Ihrer Dienstleistung, registrieren Sie den Empfänger:

IntentFilter filters = new IntentFilter(); 
filters.addAction(Intent.ACTION_SCREEN_OFF); 
filters.addAction(Intent.ACTION_SCREEN_ON); 
filters.addAction("MY_ACTION_WHEN_SCREEN_IS_OFF"); 
registerReceiver(screenReceiver, filters); 

Dann nur sicherstellen, dass die Methode haben wir oben genannt:

void startDiscoveryProcess() { 
    //start discovery process 
    // do something... 

    // then send the broadcast yourself to do this every 50 seconds because discovery stops at 60 seconds 
    if(!screenOn) { 
     Intent intent = new Intent("MY_ACTION_WHEN_SCREEN_IS_OFF"); 
     sendBroadcast(intent); 
    } 
} 
Verwandte Themen