Is it possible to detect rejected calls in Android?

后端 未结 3 1390
悲&欢浪女
悲&欢浪女 2020-12-17 03:43

In my application, it would be nice to intercept when the user rejects a call, i.e. choose to send busy tone. Is there any way, besides being notified when there is an inco

相关标签:
3条回答
  • 2020-12-17 04:22

    Hey. You could use the PhoneStateListener and CallLog classes to query the recent calls list to find rejected calls.

    http://developer.android.com/reference/android/provider/CallLog.html http://developer.android.com/reference/android/telephony/PhoneStateListener.html

    Alternatively you can monitor broadcasts on android.intent.action.NEW_OUTGOING_CALL and android.intent.action.NEW_INCOMING_CALL just put android.permission.PROCESS_INCOMING_CALLS and android.permission.PROCESS_OUTGOING_CALLS in your manifest.

    0 讨论(0)
  • 2020-12-17 04:30

    After a long time, Search and logic to solve this problem, I get the solution:

    Problem: If i call a person, if my call is not accepted by the person,in my side i have to show a Toast is my call is rejected

    Solution : Create a receiver which is register by two action

    android.intent.action.NEW_OUTGOING_CALL android.intent.action.PHONE_STATE

    Both action are necessary.

    For this you have to take given permission

       <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
        <uses-permission android:name="android.permission.CALL_PHONE"/>
        <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
        <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
    

    Manifast.xml

    <receiver android:name="Call_Receiver">
                <intent-filter>
    
                    <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
                    <action android:name="android.intent.action.PHONE_STATE"/>
    
                </intent-filter>
            </receiver>
    

    And your BroadcastReceiver class

    *Call_Receiver.java*

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.telephony.PhoneStateListener;
    import android.telephony.TelephonyManager;
    import android.util.Log;
    import android.widget.Toast;
    
    /** 
     * 
     */
    public class Call_Receiver extends BroadcastReceiver {
    
        private Context ctx;
    
    
        @Override
        public void onReceive(Context context, Intent intent) {
            ctx = context;
            OutgoingIncomingCallListener phoneListener = new OutgoingIncomingCallListener();
            TelephonyManager telephony = (TelephonyManager) context
                    .getSystemService(Context.TELEPHONY_SERVICE);
    
            if (intent.getAction()
                    .equals("android.intent.action.NEW_OUTGOING_CALL")) {
    
                Log.i("", " :::::::::::: inside onReceive if &&&&&&  :::::::::::::");
    
                telephony.listen(phoneListener,
                        PhoneStateListener.LISTEN_CALL_STATE);
    
            }
        }
    
        class OutgoingIncomingCallListener extends PhoneStateListener {
            public boolean wasRinging;
    
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                switch (state) {
                case TelephonyManager.CALL_STATE_RINGING:
                    Log.i("", "  ************   RINGING  ********");
                    wasRinging = true;
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    Log.i("", "  ***********  OFFHOOK  ********");
    
                    if (!wasRinging) {
                        // Start your new activity
                        Log.i("", "  ***********  if  ********");
                    } else {
                        // Cancel your old activity
                        Log.i("", "  ***********  else  ********");
                    }
    
                    // this should be the last piece of code before the break
                    wasRinging = true;
                    break;
                case TelephonyManager.CALL_STATE_IDLE:
                    Log.i("", "  ::::::::::: IDLE  :::::::::");
                    // this should be the last piece of code before the break
                    // Log.i("", "  ***********  OFFHOOK  ********");
    
                    if (wasRinging) {
                        Toast.makeText(ctx,
                                "Your call is disconnected by receiver", 10000)
                                .show();
                    }
                    wasRinging = true;
                    break;
                }
            }
        }
    }
    

    This will show you a Toast when you call is not accepting.

    0 讨论(0)
  • 2020-12-17 04:33

    what if use android.intent.action.NEW_INCOMING_CALL?

    When you reject incoming call, callstate changes from ringing to idle. This means you rejected.

    If call state changes from OFFHOOK to idle it means you answered a call.

    0 讨论(0)
提交回复
热议问题