java - 使用服务内的广播接收器检测调用结束

标签 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);

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

编辑: 我解决了这个问题,结果发现我在 list 中写了错误的操作,更改后它并没有崩溃。

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

最佳答案

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

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

关于java - 使用服务内的广播接收器检测调用结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15818104/

相关文章:

android - 使用 Receiver 或 Service 从后台运行弹出通知

java - 如何在动态加载的 jar 中模拟方法

android - EditText 不在 getText() 上返回内容

java - 解释整数溢出的两种方法

安卓:设置初始保存状态

java - Android:使用 ANT 编译 APK,项目文件夹外的公共(public)库

android - 加速度计似乎只能工作几秒钟?

当短信来自电子邮件时,android.provider.Telephony.SMS_RECEIVED 不会触发

java - Android EditText.setHint 在 fragment 中不起作用

java - JPA 中的 @Query 为 STR TO DATE 提供 null 输出