Ich versuche herauszufinden, wann die Roaming-Aktivierung erfolgt. Bis jetzt habe ich das folgende Stück Code benutzt, aber weil ich es nicht testen konnte, bin ich mir dessen Korrektheit nicht bewusst.
%Vor%Ich habe dies geschrieben und denke, dass sich die Signalzelle ändern muss, damit das Roaming aktiviert wird. Bitte lassen Sie mich wissen, ob mein Abzug korrekt ist oder nicht, und wenn nicht, wie kann ich dies erreichen?
Ich denke, dass Sie isRoaming () in der NetworkInfo-Klasse verwenden möchten. Aber zuerst möchten Sie einen Change-Broadcast-Listener registrieren:
%Vor%Dies gibt Ihnen einen Aktionsnamen: ConnectivityManager.CONNECTIVITY_ACTION
%Vor%[Bearbeiten: bekanntes Problem] HINWEIS: Es scheint einen Fehler bei bestimmten Versionen zu geben, wobei getActiveNetworkInfo () beim Roaming null zurückgibt. Siehe hier: Ссылка
Ich hoffe, das hilft!
Emmanuel
Sie können auch auf isNetworkRoaming()
im TelephonyManager testen, wenn Sie wissen möchten, ob Voice Roaming vorliegt, selbst wenn der Empfänger von android.net.conn.CONNECTIVITY_CHANGE
ausgelöst wird.
Ich denke, das wird auch den Fehler vermeiden, wenn getActiveNetworkInfo()
null zurückgibt.
Zuverlässige Methode zum Abrufen eines Ereignisses bei Änderungen des Roaming-Status ist
%Vor%Wenn der Roaming-Status erkannt wird, wird PhoneListener mit der Methode serviceStateChanged benachrichtigt.
Ich habe dies durch einen Blick auf den AOSP-Quellcode bestätigt.
CDMA
CDMA LTE
GSM
Überprüfen Sie die Methode pollStateDone (), hier wird der Roaming-Status für den TelephonyManager
festgelegtIn meinem Fall lausche ich bereits mit dem TelephonyManager und dem PhoneStateListener auf Netzwerkstatusänderungen, so wie der ursprüngliche Fragesteller, ob Roaming-Ereignisse dort entdeckt werden können.
(Dies wäre eine Alternative zur Verwendung der ConnectivityManager / NetworkInfo-Lösung in der akzeptierten Antwort.)
Um Änderungen zu erkennen, schlägt die ursprüngliche Frage vor, auf Veränderungen im Zellstandort zu achten, aber ich frage mich, ob dies mehr Ereignisse als nötig verursachen würde.
Ich würde mir vorstellen, dass eine Änderung des Roaming-Status nur bei einer Änderung des Netzwerkzustands auftreten kann.
%Vor%Es gibt zwei Einschränkungen für diese Methode, aber ich denke, dass die ConnectivityManager-Lösung (in der akzeptierten Antwort) die gleichen Probleme hat:
Ich höre auf Änderungen im Datennetzwerkzustand. Wenn der Benutzer keine Datenverbindung herstellt (zB sind sie nur Sprachroaming), dann wird es nicht funktionieren, aber ich denke nicht, dass dies ein Problem ist, weil die meisten von uns versuchen, Datenroaming zu erkennen (z. B. unsere Apps) Verwenden Sie keine Daten, wenn sich der Benutzer im Roaming befindet.
Ich bin mir nicht sicher, ob sich der Datenverbindungszustand ändern muss, wenn der Benutzer anfängt zu roamen - es ist nur meine Theorie und ich wäre daran interessiert zu hören, ob es jemand besser weiß.
Abschließend möchte ich noch hinzufügen, dass es möglich ist, PhoneStateListener :: onServiceStateChanged () anzuhören, die beste Lösung von allen zu sein: einfach und mit den wenigsten unnötigen Ereignissen (dies sollte selten ausgelöst werden), aber ich finde die Dokumente mehrdeutig und kann nicht feststellen, ob das PSL-Ereignis für eine Änderung in einem der Attribute des ServiceState-Objekts ausgelöst wird (z. B. einschließlich Roaming) oder nur für das Dienststatusattribut des ServiceState.
Mit Android 5.1 Update gibt es jetzt eine sehr einfache Roaming-Erkennung: Verwenden Sie einfach den SubscriptionManager und erhalten Sie Roaming-Informationen von SubscriptionInfo getDataRoaming () . Wenn mehrere SIMs vorhanden sind, wird nur die Information von aktivem zurückgegeben, was praktisch ist.
Dies funktioniert perfekt ohne irgendwelche lissenten 1 für Roaming und 0 für Nonroaming
%Vor%Tags und Links android