2013-07-17 49 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