2013-07-17 83 views
0

嘿,我有一個OutgoingCallReceiver,它可以檢測外出電話的發生。如果撥打了特殊號碼,則會啓動服務。Android - 在通話結束時檢測OutgoingCallReceiver

但現在,我遇到了一個問題,即當傳出呼叫結束時,我需要停止相同的服務。

有沒有一種很好的方法來做到這一點?謝謝!!

ublic class OutgoingCallReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context arg0, Intent arg1) { 
    // TODO Auto-generated method stub 


    boolean ringing = false, offhook = false; 

    Intent i = new Intent(arg0, MyServices.class); 
    Intent ii = new Intent(arg0, RecorderService.class); 
    Bundle bundle = arg1.getExtras(); 

    if(null == bundle) 
      return; 


    String phonenumber = arg1.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 

    Log.i("OutgoingCallReceiver",phonenumber); 
    Log.i("OutgoingCallReceiver",bundle.toString()); 


    if(phonenumber.equals("#1234") || bundle.toString().equals("#1234")) { 

     ii.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     arg0.startService(ii); 
    } 


    String action = arg1.getAction(); 
    if (Intent.ACTION_NEW_OUTGOING_CALL.equals(action)) { 

    } else{ 
     arg0.stopService(ii); 
    } 



    } 
}  

有代碼。

感謝您的幫助,並感謝您的幫助。謝謝!

回答

0

類爲MyService:

public class MyService extends Service { 

private CallListener call = null; 

public MyService() { 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    call = new CallListener(getApplicationContext()); 
    call.start(); 
    return(START_STICKY); 
} 

@Override 
public void onDestroy() { 
    call.stop(); 
    call.onDestroy(); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 
} 

類CallListener:

public class CallListener { 

private CallStateListener callStateListener = null; 
private OutgoingReceiver outgoingReceiver = null; 

public CallListener(Context context) { 
    this.context = context; 

    callStateListener = new CallStateListener(); 
    outgoingReceiver = new OutgoingReceiver(); 
} 

private class CallStateListener extends PhoneStateListener { 
    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     switch (state) { 
     case TelephonyManager.CALL_STATE_IDLE: 
     doSomething1(); 
     break; 
     case TelephonyManager.CALL_STATE_OFFHOOK: 
     doSomething2(); 
     break; 
     case TelephonyManager.CALL_STATE_RINGING: 
     doSomething3(); 
     break; 
     } 
    } 
} 

public class OutgoingReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     doSomething4(); 
    } 
} 

public void start() { 
    telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
    telephonyManager.listen(callStateListener, PhoneStateListener.LISTEN_CALL_STATE); 

    IntentFilter intentFilter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL); 
    context.registerReceiver(outgoingReceiver, intentFilter); 
} 

public void stop() { 
    telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
    telephonyManager.listen(callStateListener, PhoneStateListener.LISTEN_NONE); 

    context.unregisterReceiver(outgoingReceiver); 
} 
} 
+0

應的代碼是在一個新的類?我對Android很新,所以更清晰的代碼會非常好。謝謝! – user2563959

+0

@ user2563959已更新回答... – powder366

+0

我應該把開始活動放在OutgoingReceiver中嗎?並把stop();在CALL_STATE_OFFHOOK? – user2563959