2016-05-01 8 views
1

Ich habe folgenden Code:Erster Telefonstatus in Xamarin

public class StateListener : PhoneStateListener 
    { 
     StateListener phoneStateListener = new StateListener(); 
     TelephonyManager telephonyManager = (TelephonyManager)GetSystemService(Context.TelephonyService); 
     telephonyManager.Listen(phoneStateListender, PhoneStateListenerFlags.CallState); 

     public void onCallStateChanged(CallState state, String incomingNumber) 
     { 
      base.OnCallStateChanged(state, incomingNumber); 
      switch (state) 
      { 
       case CallState.Ringing: 
        break; 
       case CallState.Offhook: 
        break; 
       case CallState.Idle: 
        break; 
      } 
     } 
    } 

Dies ist eine innere Klasse, weil meine Basisklasse "MainActivity: Activity". Der obige Code stammt von Java, also habe ich versucht, ihn in C# umzuwandeln. Allerdings bekomme ich erros in diesem Fall:

(TelephonyManager)GetSystemService(Context.TelephonyService); 

wirft einen Fehler, dass Feld initializers statisch sein muss und

telephonyManager.Listen(phoneStateListender, PhoneStateListenerFlags.CallState); 

ist in diesem Zusammenhang nicht zur Verfügung. Ich weiß nicht einmal, ob der obige Code überhaupt funktionieren würde. Wie in Xamarin zu erreichen, dass ich den Status eines ausgehenden Anrufs erhalten kann?

Antwort

3

Sie müssen den Erstellungscode in die OnCreate Methode Ihrer Aktivität verschieben.

protected override void OnCreate(Bundle bundle) 
{ 
    base.OnCreate(bundle); 

    StateListener phoneStateListener = new StateListener(); 
    TelephonyManager telephonyManager = (TelephonyManager)GetSystemService(Context.TelephonyService); 
    telephonyManager.Listen(phoneStateListener, PhoneStateListenerFlags.CallState); 
} 

Und dann können Sie die Klasse erstellen:

public class StateListener : PhoneStateListener 
{ 
    public override void OnCallStateChanged(CallState state, string incomingNumber) 
    { 
     base.OnCallStateChanged(state, incomingNumber); 
     switch (state) 
     { 
      case CallState.Ringing: 
       break; 
      case CallState.Offhook: 
       break; 
      case CallState.Idle: 
       break; 
     } 
    } 
} 

Wenn Sie etwas auf Sie Aktivität nach OnCallStateChanged tun wollen, müssen Sie die Aktivität übergeben (zB im Konstruktor):

public class StateListener : PhoneStateListener 
{ 
    private readonly MainActivity _activity; 

    public StateListener(MainActivity activity) 
    { 
     _activity = activity; 
    } 

    public override void OnCallStateChanged(CallState state, string incomingNumber) 
    { 
     base.OnCallStateChanged(state, incomingNumber); 
     _activity.UpdateCallState(state, incomingNumber); 
    } 
} 

public class MainActivity : Activity 
{ 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     StateListener phoneStateListener = new StateListener(this); 
     TelephonyManager telephonyManager = (TelephonyManager)GetSystemService(Context.TelephonyService); 
     telephonyManager.Listen(phoneStateListener, PhoneStateListenerFlags.CallState); 
    } 

    public void UpdateCallState(CallState state, string incomingNumber) 
    { 
     // numberLabel.Text = ... 
    } 
} 
+0

Entschuldigung. Ich hatte einen Fehler im Code. Danke für Ihre Hilfe! Das funktioniert jetzt! – Canox