2017-04-03 12 views
0

私のアプリはシンプルなサービスを持っています。ユーザーが電話をかけたり受信したときにサービスを一時停止したり、通話が終了した後にサービスを再開する必要があります。 TeleListenerクラスから着信中にサービスを一時停止し、通話が終了した後にサービスを再開するにはどうすればよいですか?

public class MyService extends Service { 
private static final String TAG = "MyService"; 

private boolean isRunning = false; 

@Override 
public void onCreate() { 
    Log.i(TAG, "Service onCreate"); 

    isRunning = true; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    Log.i(TAG, "Service onStartCommand"); 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      for (int i = 0; i < Integer.MAX_VALUE; i++) { 
       try { 
        Thread.sleep(1000); 
       } catch (Exception e) { 
       } 

       if (isRunning) { 
        Log.i(TAG, "Service running"); 
       } 
      } 

      stopSelf(); 
     } 
    }).start(); 

    return Service.START_STICKY; 
} 


@Override 
public IBinder onBind(Intent arg0) { 
    Log.i(TAG, "Service onBind"); 
    return null; 
} 

@Override 
public void onDestroy() { 

    isRunning = false; 

    Log.i(TAG, "Service onDestroy"); 
}} 

でMainActivity I - :ここで

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Intent intent = new Intent(getApplicationContext(), MyService.class); 
    startService(intent); 


    TelephonyManager TelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
    TelephonyMgr.listen(new TeleListener(), 
      PhoneStateListener.LISTEN_CALL_STATE); 
} 


class TeleListener extends PhoneStateListener { 
    public void onCallStateChanged(int state, String incomingNumber) { 
     super.onCallStateChanged(state, incomingNumber); 
     switch (state) { 
      case TelephonyManager.CALL_STATE_IDLE: 
       Toast.makeText(getApplicationContext(), "CALL_STATE_IDLE", 
         Toast.LENGTH_LONG).show(); 
       break; 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
       Toast.makeText(getApplicationContext(), "CALL_STATE_OFFHOOK", 
         Toast.LENGTH_LONG).show(); 
       break; 
      case TelephonyManager.CALL_STATE_RINGING: 
       Toast.makeText(getApplicationContext(), incomingNumber, 
         Toast.LENGTH_LONG).show(); 
       Toast.makeText(getApplicationContext(), "CALL_STATE_RINGING", 
         Toast.LENGTH_LONG).show(); 
       break; 
      default: 
       break; 
     } 
    } 
}} 

Serviceクラスファイルである - は:ここに

は次のように私の主な活動が見えています電話の状態を取得することができます。私の問題はTelephonyManagerがCALL_STATE_OFFHOOKに等しいとき、私はMyServiceでを一時停止する必要があるとTelephonyManagerがCALL_STATE_IDLEに等しいときに、私はあなたがメソッドをonCallStateChanged使用する必要がたMyService

答えて

0

を再開する必要があります。

この行をonCreate()メソッドに入れると、TelephonyManagerのオブジェクトが初期化され、リスナーがセットアップされます。

TelephonyManager tManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); 
ListenToPhoneState listener = new ListenToPhoneState() 
tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); 

innerclass ListenToPhoneStateのクラス定義は次のように見ているだろう、

private class ListenToPhoneState extends PhoneStateListener { 

    boolean callEnded=false; 
    public void onCallStateChanged(int state, String incomingNumber) { 

     switch (state) { 
     case TelephonyManager.CALL_STATE_IDLE: 
      UTILS.Log_e("State changed: " , state+"Idle"); 


      if(callEnded) 
      { 
       //you will be here at **STEP 4** 
       //you should stop service again over here 
      } 
       else 
       { 
       //you will be here at **STEP 1** 
      //stop your service over here, 
       //i.e. stopService (new Intent(`your_context`,`CallService.class`)); 
       //NOTE: `your_context` with appropriate context and `CallService.class` with appropriate class name of your service which you want to stop. 

       } 


      break; 
     case TelephonyManager.CALL_STATE_OFFHOOK: 
      UTILS.Log_e("State changed: " , state+"Offhook"); 
       //you will be here at **STEP 3** 
      // you will be here when you cut call 
      callEnded=true; 
      break; 
     case TelephonyManager.CALL_STATE_RINGING: 
      UTILS.Log_e("State changed: " , state+"Ringing"); 
       //you will be here at **STEP 2** 

      break; 


     default: 
      break; 
     } 
    } 

} 

、について説明:呼び出している間、あなたのリスナーが次の状態を通過します、

ステップ1:TelephonyManager.CALL_STATE_IDLE

最初にコール状態はアイドル状態になるため、変数callEndedの値はfalseになります。

ステップ2:今TelephonyManager.CALL_STATE_RINGING

あなたは、受信者を待っているが

ステップ通話受信する3:あなたが呼び出しにカットTelephonyManager.CALL_STATE_OFFHOOK

ステップ4:TelephonyManager.CALL_STATE_IDLE

アイドル再び

注:コールが終了し、どのような通話を終了した後に行われる必要があります知られたくない場合は、単にcallEnded変数を削除し、私はそれを願っていますTelephonyManager.CALL_STATE_IDLE

のブロックに入るたび、サービスを停止助けてください!

+0

私はすでにそれらを宣言しています。私はCALL_STATE_OFFHOOKとCALL_STATE_IDLEでサービスを一時停止し、再開する必要があります。 – Karthik

+0

正常に動作しますが、アプリケーションが開いているときにのみ動作しますが、サービスのように常に動作する必要があります。 – Karthik

0

サービスを一時停止または再開することはできません。コールが終了したら、サービスを再開することができます。 PhoneStateListenerTelephonyManager.CALL_STATE_OFFHOOKの定数の内側にもう一度サービスを開始してください。 @ Tijoで述べたようにPhoneStateListenerのさまざまな状態を使用すると、いつサービスを開始または停止するかを決めることができます。

関連する問題