Question

I have intercepted incoming call and show my activity over standard screen. On this activity I have buttons "answer call" and "reject call", but I can't do it working.

I have found two solutions to answer/reject phone call programaticaly:

  1. With ITelephony.aidl but it works only before api v10. So it is wrong way
  2. With following:

    private void acceptCall(Context context) {
      Intent buttonDown = new Intent(Intent.ACTION_MEDIA_BUTTON);
      buttonDown.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(
            KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
      context.sendOrderedBroadcast(buttonDown,
            "android.permission.CALL_PRIVILEGED");
        // froyo and beyond trigger on buttonUp instead of buttonDown
      Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON);
      buttonUp.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(
            KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
      context.sendOrderedBroadcast(buttonUp,
            "android.permission.CALL_PRIVILEGED");
    }
    
    
    private void acceptCall(Context context) {
      Intent buttonDown = new Intent(Intent.ACTION_MEDIA_BUTTON);
      buttonDown.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(
            KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK));
      context.sendOrderedBroadcast(buttonDown,
            "android.permission.CALL_PRIVILEGED");
      // froyo and beyond trigger on buttonUp instead of buttonDown
      Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON);
      buttonUp.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(
            KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
      context.sendOrderedBroadcast(buttonUp,
            "android.permission.CALL_PRIVILEGED");
    }
    

from here http://www.codeproject.com/Tips/578817/Reject-and-Accept-an-Incoming-Call

However nothing! I click buttons and invoke methods above accordingly, and nothing happens. I tested it on several devices, and result the same.

Hmm, then I was successful with answering on samsung nexus one, but not on HTC with sense. Reject function doesnt work on both.

Was it helpful?

Solution

As result I have found http://androidbridge.blogspot.com/2011/05/how-to-answer-incoming-call-in-android.html

Here is solution which works on HTCs devices:

In Android 2.3.3 HTC Sensation this piece of code does not work. Reason is in 2.3.3 I found a HeadsetObserver listening for actual bluetooth plug-in event. So you need to send a Intent pretending there is a headset connected already. To fix this problem you need to send the ACTION_HEADSET_PLUG Intent before calling the above code.

So I added following code before accept call code:

Intent headSetUnPluggedintent = new Intent(Intent.ACTION_HEADSET_PLUG);
 headSetUnPluggedintent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
 headSetUnPluggedintent.putExtra("state", 1); // 0 = unplugged  1 = Headset with microphone 2 = Headset without microphone
 headSetUnPluggedintent.putExtra("name", "Headset");
 // TODO: Should we require a permission?
 sendOrderedBroadcast(headSetUnPluggedintent, null);

so final worked code is

    private void acceptCall() {
    setHeadSetConnectEmulated();
    Intent buttonUP = new Intent(Intent.ACTION_MEDIA_BUTTON);
    buttonUP.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
    IncomingCallActivity.this.getApplicationContext().sendOrderedBroadcast(buttonUP, "android.permission.CALL_PRIVILEGED");
}

private void setHeadSetConnectEmulated(){
    Intent headSetUnPluggedintent = new Intent(Intent.ACTION_HEADSET_PLUG);
    headSetUnPluggedintent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
    headSetUnPluggedintent.putExtra("state", 1); // 0 = unplugged  1 = Headset with microphone 2 = Headset without microphone
    headSetUnPluggedintent.putExtra("name", "Headset");
    // TODO: Should we require a permission?
    sendOrderedBroadcast(headSetUnPluggedintent, null);
}

private void rejectCall() {
    Intent buttonDown = new Intent(Intent.ACTION_MEDIA_BUTTON);
    buttonDown.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK));
    IncomingCallActivity.this.getApplicationContext().sendOrderedBroadcast(buttonDown, "android.permission.CALL_PRIVILEGED");
}

OTHER TIPS

I have had the same issue. The purpose of the button up/down intents is to mimic a headset answer. Some phones and versions of android will ignore the intents if there is not headset plugged in. You need to first check the headset state (so it can be reset afterwords) and send an intent to "plug in" a headset.

I had a similar problem except I was trying to make a call from an app I created. It was remedied by adding this to the manifest.

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

you can use this Reciver To Pickup or reject,

public class AutoAnswerIntentService extends BroadcastReceiver {

Context context = null;
private static String mFileName = null;

private static final String TAG = "in reciver";

@Override
public void onReceive(Context context, Intent intent) {
    // Toast.makeText(context, "calling now", Toast.LENGTH_LONG).show();
    if (!intent.getAction().equals("android.intent.action.PHONE_STATE"))
        return;
    else {
        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
                    if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
        String number = intent
                .getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
        Log.d(TAG, "Incoming call from: " + number);
        Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON);
        buttonUp.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(
                KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
        try {
            context.sendOrderedBroadcast(buttonUp,
                    "android.permission.CALL_PRIVILEGED");
            Log.d(TAG, "ACTION_MEDIA_BUTTON broadcasted...");
            // startRecording();
        } catch (Exception e) {
            Log.d(TAG, "Catch block of ACTION_MEDIA_BUTTON broadcast !");


            return;
        } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {

            Log.d(TAG, "CALL ANSWERED NOW !!");
            return;
        } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
            Log.d(TAG, "ALL DONE IN ELSE IF...... !!");

        } else {
            Log.d(TAG, "ALL DONE IN ELSE ...... !!");

        }
    }
}

} and in manifest file add this permission

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top