簡體   English   中英

使用服務中的廣播接收器檢測呼叫結束

[英]Detecting End of Call with Broadcast Receiver inside a 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);

該服務運行成功,接收器檢測到有來電但應用程序崩潰后,任何想法為什么會發生這種情況? 感謝您的幫助!

編輯:我解決了這個問題,事實證明我在清單中寫了錯誤的操作,更改后它沒有崩潰。

但是現在接收器只檢測來電,但是沒有檢測到呼叫被接聽或接聽的時間,它確實檢測到了幾次,但大部分時間沒有檢測到,呼叫結束后振鈴仍然開啟! 有任何想法嗎?

終於找到了出路! 在將振鈴模式設置為靜音之前,我添加了一秒的延遲,我不知道這個解決方案是如何工作的,但確實如此!

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM