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

Java 使用服务内的广播接收器检测呼叫结束,java,android,broadcastreceiver,android-service,Java,Android,Broadcastreceiver,Android Service,我正在编写一个Android应用程序,我需要在服务中运行广播接收器,接收器检测何时有来电,何时通话结束或接听,服务将手机置于静音模式,接收器检测何时有来电,如果有来电,接收器将振铃器模式设置为响铃并正常振动,当呼叫接听或结束时,接收器将振铃器再次设置为静音模式 这是我的听筒: private final BroadcastReceiver CallReceiver = new BroadcastReceiver() { public void onReceive(Context cont

我正在编写一个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);
该服务正在成功运行,接收器检测到何时有来电,但随后应用程序崩溃,你知道为什么会发生这种情况吗? 谢谢你的帮助

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

但现在,接收器只检测到来电,但没有检测到呼叫何时接听或结束,它确实检测到了几次,但大多数情况下它没有,振铃器在呼叫结束后仍然打开! 有什么想法吗?

终于找到了解决办法! 在将振铃器模式设置为静音之前,我增加了一秒钟的延迟,我不知道这个解决方案是如何工作的,但它做到了

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
        }
    }
       };

查看logcat中的崩溃并发布stacktrace和错误消息我修复了崩溃,但现在接收器没有检测到通话结束,通话结束后手机仍处于正常振铃模式。您如何启动/停止服务?从
onStartCommand()
返回什么?当调用完成时,您能否判断您的服务是否仍在运行?我正在从主活动onCreate()方法启动该服务,方法是通过intent:intent service=new intent(这是CallDetectService.class)启动该服务;startService(服务);我正在从onStartCommand()返回此命令:return Service.START\u NOT\u STICKY;我不确定该服务是否仍在运行,但在我进行修复后,它没有显示任何终止的迹象。请尝试从
onStartCommand()
返回“START\u STICKY”。这将保持您的服务运行。我猜你的服务在打电话的时候被取消了。