使用服务中的广播接收器检测呼叫结束

时间:2013-04-04 17:45:08

标签: java android broadcastreceiver android-service

我正在编写Android应用程序,我需要在服务中运行广播接收器,接收器检测到有来电时以及当呼叫结束或应答时,服务将手机置于静音模式并且接收器检测到有来电时,如果有来电,接收器将振铃模式设置为振铃并正常振动,当接听或接听电话时,接收器再次将振铃器设置为静音模式。

这是我的接收者:

private final BroadcastReceiver CallReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        AudioManager amanager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
        amanager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        if (TelephonyManager.EXTRA_STATE_RINGING.equals(state))
        {
            amanager.setRingerMode(2);  //Ringer ON
        }
        if (TelephonyManager.EXTRA_STATE_IDLE.equals(state))
        {
            amanager.setRingerMode(0);  //Ringer Silent
        }
        if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state))
        {
            amanager.setRingerMode(0);  ////Ringer Silent
        }
    }
       };

在我的服务中的onStartCommand方法中:

      IntentFilter filter = new IntentFilter();
      filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
      registerReceiver(CallReceiver, filter);

服务正在成功运行,接收方检测到有来电但是应用程序崩溃后,有什么想法发生这种情况? 感谢您的帮助!

编辑: 我解决了这个问题,结果我在清单中写了错误的动作,更改后它没有崩溃。

但是现在接收器只检测来电,但是没有检测到呼叫被接听或接听的时间,它确实检测到了几次,但大多数情况下它没有检测到,呼叫器仍在接通电话结束了! 任何想法?

1 个答案:

答案 0 :(得分:2)

终于找到了出路! 在将铃声模式设置为静音之前,我添加了一秒的延迟,我不知道这个解决方案是如何工作的,但确实如此!

private final BroadcastReceiver CallReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        AudioManager amanager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
        amanager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

        if (TelephonyManager.EXTRA_STATE_IDLE.equals(state))
        {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            amanager.setRingerMode(0);  //Ringer Silent
        }
        if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state))
        {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            amanager.setRingerMode(0);  ////Ringer Silent
        }
        if (TelephonyManager.EXTRA_STATE_RINGING.equals(state))
        {
            amanager.setRingerMode(2);  //Ringer ON
        }
    }
       };