-2

I wanna write an android app using eclipse witch gets the phone number from the user,and after calling the phone number(using intent or something else) returns to the app and calls different methods depending on the respond (reject, missed, ...)

I know how to call a number using intent but don't know how to handle this solution (returning to app right after being rejected or missed)

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
R1100
  • 11
  • 3
  • Someone asked this before at this link: https://stackoverflow.com/a/13438493/4226541 this should be good for you – ad3luc Aug 02 '17 at 07:36

1 Answers1

0
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class PhoneCall {

    public static final String PARAM_CALL_DONE = "CALL_DONE";

    public static void call(String phoneNumber, Activity activity) {
        CallEndedListener.createListenerFor(activity);
        Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber));
        activity.startActivity(callIntent);
    }

    private static class CallEndedListener extends PhoneStateListener {
        private boolean called = false;
        private final TelephonyManager telephonyManager;
        private final Context context;
        private Activity activity;

        private CallEndedListener(Activity act) {
            this.context = act.getBaseContext();
            this.activity = act;
            this.telephonyManager = (TelephonyManager) context
                    .getSystemService(Activity.TELEPHONY_SERVICE);
        }

        public static void createListenerFor(Activity act) {
            CallEndedListener listener = new CallEndedListener(act);
            listener.telephonyManager.listen(listener, LISTEN_CALL_STATE);
        }

        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            if (called && state == TelephonyManager.CALL_STATE_IDLE) {
                called = false;
                telephonyManager.listen(this, PhoneStateListener.LISTEN_NONE);
                try {
                    Intent t = new Intent(context, activity.getClass());
                    t.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    t.putExtras(activity.getIntent());
                    t.putExtra(PARAM_CALL_DONE, true);
                    t.setAction(Intent.ACTION_MAIN);
                    activity.finish();
                    activity = null;
                    context.startActivity(t);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
                    called = true;
                }
            }
        }
    }
}

By handing over the parameter "PARAM_CALL_DONE", the calling activity can test, whether it was started/resumed after a call. It makes sense to test for it in the onResume()-method like this:

@Override
protected void onResume() {
    if (extras.getBoolean(PhoneCall.PARAM_CALL_DONE)) {
        showInfoText(); // do whatever you like here...

        extras.remove(PhoneCall.PARAM_CALL_DONE);
    }
}

Do not forget to add the permission in manifest file.

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

In order to use the phone, a really simple method call should be sufficient, with "phonenumber" being a telephone number as String and being called from an Activity

PhoneCall.call(phonenumber, this);
Akshay Chopde
  • 670
  • 4
  • 10