Handling Android application pause on incoming call and resume after call end

前端 未结 2 590
无人共我
无人共我 2020-12-30 16:41

I want to pause my android application when the phone receives an incoming call. After the call ends, I want my applications to resume automatically.

How would this

相关标签:
2条回答
  • 2020-12-30 17:24

    you have to implement a Listener for the PhoneState. I did this in a private Class:

    private class PhoneCallListener extends PhoneStateListener {
    
        private boolean isPhoneCalling = false;
    
        // needed for logging
        String TAG = "PhoneCallListener";
    
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
    
            if (TelephonyManager.CALL_STATE_RINGING == state) {
                // phone ringing
                Log.i(TAG, "RINGING, number: " + incomingNumber);
            }
    
            if (TelephonyManager.CALL_STATE_OFFHOOK == state) {
                // active
                Log.i(TAG, "OFFHOOK");
    
                isPhoneCalling = true;
            }
    
            if (TelephonyManager.CALL_STATE_IDLE == state) {
                // run when class initial and phone call ended,
                // need detect flag from CALL_STATE_OFFHOOK
                Log.i(TAG, "IDLE");
    
                if (isPhoneCalling) {
    
                    Log.i(TAG, "restart app");
    
                    // restart call application
                    Intent i = getBaseContext().getPackageManager()
                            .getLaunchIntentForPackage(
                                    getBaseContext().getPackageName());
                    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                            | Intent.FLAG_ACTIVITY_CLEAR_TOP
                            | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                    startActivity(i);
    
                    isPhoneCalling = false;
                }
    
            }
    
    
    }
    }
    

    and you need to add the permission to the Manifest-File

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    
    0 讨论(0)
  • 2020-12-30 17:39
    private class EndCallListener extends PhoneStateListener {
      private boolean active = false;
      @Override
      public void onCallStateChanged(int state, String incomingNumber) {
        if(TelephonyManager.CALL_STATE_RINGING == state) {
          Log.i("EndCallListener", "RINGING, number: " + incomingNumber);
        }
        if(TelephonyManager.CALL_STATE_OFFHOOK == state) {
          //wait for phone to go offhook (probably set a boolean flag) so you know your app initiated the call.
          active = true;
          Log.i("EndCallListener", "OFFHOOK");
        }
        if(TelephonyManager.CALL_STATE_IDLE == state) {
          //when this state occurs, and your flag is set, restart your app
          Log.i("EndCallListener", "IDLE");
          if (active) {
            active = false;
            // stop listening                   
            TelephonyManager mTM = (TelephonyManager) m_activity.getSystemService( Context.TELEPHONY_SERVICE );
            mTM.listen(this, PhoneStateListener.LISTEN_NONE);
            // restart the inbox activity
            //Intent intent = new Intent(m_activity, MDInboxActivity.class);
            //m_activity.startActivity(intent);
          }
        }
      }
    }
    

    And you can initialize the above class by calling the below lines:

    try {
      EndCallListener callListener = new EndCallListener();
      TelephonyManager mTM = (TelephonyManager) m_activity.getSystemService(Context.TELEPHONY_SERVICE);
      mTM.listen(callListener, PhoneStateListener.LISTEN_CALL_STATE);
    } catch(Exception e) {
      Log.e("callMonitor", "Exception: "+e.toString());
    }
    
    0 讨论(0)
提交回复
热议问题