1

我正在编写一个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);

该服务正在成功运行,并且接收器检测到何时有来电但应用程序随后崩溃,任何想法为什么会发生这种情况?感谢您的帮助!

编辑:我解决了这个问题,原来我在清单中写了错误的操作,更改后它不会崩溃。

但是现在接收器只检测到来电,但没有检测到电话何时接听或结束,它确实检测到了几次,但大多数时候它没有检测到,通话结束后铃声仍然打开!有任何想法吗?

4

1 回答 1

3

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

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
        }
    }
       };
于 2013-04-07T00:24:22.840 回答