2016-05-01 14 views
1

の電話の状態を取得する:は、私は次のコードしている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; 
      } 
     } 
    } 

を私の基本クラス「:活動MainActivity」であるので、これは内部クラスです。上記のコードはJavaのものなので、C#に変換しようとしました。しかし、私はこのケースでerrosを得る:

(TelephonyManager)GetSystemService(Context.TelephonyService); 

は、フィールド初期化子が静的でなければならず、

telephonyManager.Listen(phoneStateListender, PhoneStateListenerFlags.CallState); 

はこのコンテキストでは使用できないというエラーがスローされます。上記のコードがうまくいくかどうかわかりません。 発信コールの状態を取得できることをXamarinで達成するにはどうすればよいですか?

答えて

3

作成コードをアクティビティのOnCreateメソッドに移動する必要があります。

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

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

そして、あなたはクラスを作成することができます:あなたはOnCallStateChanged後、あなたの活動に何かをしたい場合は、(例えば、コンストラクタで)活性を渡す必要が

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; 
     } 
    } 
} 

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

申し訳ありません。私はコードに誤りがありました。ご協力ありがとうございました!これは今動作します! – Canox

関連する問題