How to make a phone call in android and come back to my activity when the call is done?

AndroidPhone Call

Android Problem Overview


I am launching an activity to make a phone call, but when I pressed the 'end call' button, it does not go back to my activity. Can you please tell me how can I launch a call activity which comes back to me when 'End call' button is pressed? This is how I'm making the phone call:

    String url = "tel:3334444";
    Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(url));

Android Solutions


Solution 1 - Android

use a PhoneStateListener to see when the call is ended. you will most likely need to trigger the listener actions to wait for a the call to start (wait until changed from PHONE_STATE_OFFHOOK to PHONE_STATE_IDLE again) and then write some code to bring your app back up on the IDLE state.

you may need to run the listener in a service to ensure it stays up and your app is restarted. some example code:

EndCallListener callListener = new EndCallListener();
TelephonyManager mTM = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
mTM.listen(callListener, PhoneStateListener.LISTEN_CALL_STATE);

Listener definition:

private class EndCallListener extends PhoneStateListener {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        if(TelephonyManager.CALL_STATE_RINGING == state) {
            Log.i(LOG_TAG, "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.
            Log.i(LOG_TAG, "OFFHOOK");
        }
        if(TelephonyManager.CALL_STATE_IDLE == state) {
            //when this state occurs, and your flag is set, restart your app
            Log.i(LOG_TAG, "IDLE");
        }
    }
}

In your Manifest.xml file add the following permission:

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

Solution 2 - Android

This is regarding the question asked by Starter.

The problem with your code is that you are not passing the number properly.

The code should be:

private OnClickListener next = new OnClickListener() {

     public void onClick(View v) {
	    EditText num=(EditText)findViewById(R.id.EditText01); 
	    String number = "tel:" + num.getText().toString().trim();
	    Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse(number)); 
	    startActivity(callIntent);
	}
};

Do not forget to add the permission in manifest file.

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

or

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

for emergency number in case DIAL is used.

Solution 3 - Android

We had the same problem and managed to solve it by using a PhoneStateListener to identify when the call ends, but additionally we had to finish() the original activity before starting it again with startActivity, otherwise the call log would be in front of it.

Solution 4 - Android

I found the EndCallListener the most functional example, to get the behaviour described (finish(), call, restart) I added a few SharedPreferences so the Listener had a reference to manage this behaviour.

My OnClick, initialise and EndCallListener only respond to calls from app. Other calls ignored.

import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;

public class EndCallListener extends PhoneStateListener {

private String TAG ="EndCallListener";
private int 	LAUNCHED = -1;

SharedPreferences prefs = PreferenceManager
							.getDefaultSharedPreferences(
								myActivity.mApp.getBaseContext());

SharedPreferences.Editor _ed = prefs.edit();

@Override
    public void onCallStateChanged(int state, String incomingNumber) {
	String _prefKey = myActivity.mApp						   
                      .getResources().getString(R.string.last_phone_call_state_key),
	_bPartyNumber = myActivity.mApp							  
                      .getResources().getString(R.string.last_phone_call_bparty_key);
	
	int mLastCallState = prefs.getInt(_prefKey, LAUNCHED);

    //Save current call sate for next call
	_ed.putInt(_prefKey,state);
    _ed.commit();

        if(TelephonyManager.CALL_STATE_RINGING == state) {
            Log.i(TAG, " >> RINGING, number: " + incomingNumber);
        }
        if(TelephonyManager.CALL_STATE_IDLE == state && mLastCallState != LAUNCHED ) {
            //when this state occurs, and your flag is set, restart your app
        	
        	if (incomingNumber.equals(_bPartyNumber) == true) {
        		//Call relates to last app initiated call
        	Intent 	_startMyActivity =  
               myActivity.mApp	        					 
               .getPackageManager()	        						 
               .getLaunchIntentForPackage(
                 myActivity.mApp.getResources()
                 .getString(R.string.figjam_package_path));
        	
_startMyActivity.setAction(	        							
        myActivity.mApp.getResources()
		.getString(R.string.main_show_phone_call_list));

	        	myActivity.mApp
	        			.startActivity(_startMyActivity);
	        	Log.i(TAG, "IDLE >> Starting MyActivity with intent");
        	}
        	else
	        	Log.i(TAG, "IDLE after calling "+incomingNumber);
        		
        }
        
    }
}

add these to strings.xml

<string name="main_show_phone_call_list">android.intent.action.SHOW_PHONE_CALL_LIST</string>
<string name="last_phone_call_state_key">activityLpcsKey</string>
<string name="last_phone_call_bparty_key">activityLpbpKey</string>

and something like this in your Manifest if you need to return to the look and feel before the call

  <activity android:label="@string/app_name" android:name="com.myPackage.myActivity" 
      android:windowSoftInputMode="stateHidden"
        android:configChanges="keyboardHidden" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name="android.intent.action.SHOW_PHONE_CALL_LIST" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
  </activity>

and put these in your 'myActivity'

public static Activity mApp=null; //Before onCreate()
  ...
onCreate( ... ) {
  ...
if (mApp == null) mApp = this; //Links your resources to other classes
  ...
	//Test if we've been called to show phone call list
	Intent _outcome = getIntent();
	String _phoneCallAction = mApp.getResources().getString(R.string.main_show_phone_call_list);
	String _reqAction = _outcome.getAction();//Can be null when no intent involved

		 //Decide if we return to the Phone Call List view
	   	 if (_reqAction != null &&_reqAction.equals(_phoneCallAction) == true) {
                         //DO something to return to look and feel
	   	 }

  ...
		myListView.setOnItemClickListener(new OnItemClickListener() { //Act on item when selected
	    	 @Override
	    	 public void onItemClick(AdapterView<?> a, View v, int position, long id) {

	    		 myListView.moveToPosition(position);
	    		 String _bPartyNumber = "tel:"+myListView.getString(myListView.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

	    		 //Provide an initial state for the listener to access.
	    		 initialiseCallStatePreferences(_bPartyNumber);
	    		 
	    		 //Setup the listener so we can restart myActivity
			    	EndCallListener _callListener = new EndCallListener();
		    		TelephonyManager _TM = (TelephonyManager)mApp.getSystemService(Context.TELEPHONY_SERVICE);
		    		
		    		_TM.listen(_callListener, PhoneStateListener.LISTEN_CALL_STATE);
	
			    		 Intent _makeCall = new Intent(Intent.ACTION_CALL, Uri.parse(_bPartyNumber));
			    		 					 				     
				 _makeCall.setComponent(new ComponentName("com.android.phone","com.android.phone.OutgoingCallBroadcaster"));
					startActivity(_makeCall);						    
			    finish();
			  //Wait for call to enter the IDLE state and then we will be recalled by _callListener
		      }
		});


}//end of onCreate()

use this to initilaise the behaviour for your onClick in myActivity e.g. after onCreate()

private void initialiseCallStatePreferences(String _BParty) {
	final int LAUNCHED = -1;
	SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
								mApp.getBaseContext());
	SharedPreferences.Editor _ed = prefs.edit();

	String _prefKey = mApp.getString(R.string.last_phone_call_state_key),
		   _bPartyKey = mApp.getString(R.string.last_phone_call_bparty_key);
	
	//Save default call state before next call
		_ed.putInt(_prefKey,LAUNCHED);
		_ed.putString(_bPartyKey,_BParty);
		_ed.commit();

}

You should find that clicking your list of phone numbers finishes your activty, makes the call to the number and returns to your activty when the call ends.

Making a call from outside your app while it's still around won't restart your activty (unless it's the same as the last BParty number called).

:)

Solution 5 - Android

you can use startActivityForResult()

Solution 6 - Android

This is solution from my point of view:

ok.setOnClickListener(this);
@Override
public void onClick(View view) {
	if(view == ok){
		Intent intent = new Intent(Intent.ACTION_CALL);
		intent.setData(Uri.parse("tel:" + num));
		activity.startActivity(intent);
		
	}

Of course in Activity (class) definition you have to implement View.OnClickListener .

Solution 7 - Android

Here is my example, first the user gets to write in the number he/she wants to dial and then presses a call button and gets directed to the phone. After call cancelation the user gets sent back to the application. In order to this the button needs to have a onClick method ('makePhoneCall' in this example) in the xml. You also need to register the permission in the manifest.

Manifest

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

Activity

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class PhoneCall extends Activity {

    EditText phoneTo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_phone_call);

        phoneTo = (EditText) findViewById(R.id.phoneNumber);

    }
    public void makePhoneCall(View view) {




        try {
            String number = phoneTo.getText().toString();
            Intent phoneIntent = new Intent(Intent.ACTION_CALL);
            phoneIntent.setData(Uri.parse("tel:"+ number));
            startActivity(phoneIntent);


        } catch (android.content.ActivityNotFoundException ex) {
            Toast.makeText(PhoneCall.this,
                    "Call failed, please try again later!", Toast.LENGTH_SHORT).show();
        }
    }

}

XML

 <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="phone"
        android:ems="10"
        android:id="@+id/phoneNumber"
        android:layout_marginTop="67dp"
        android:layout_below="@+id/textView"
        android:layout_centerHorizontal="true" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Call"
        android:id="@+id/makePhoneCall"
        android:onClick="makePhoneCall"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" />

Solution 8 - Android

@Override
public void onClick(View view) {
    Intent phoneIntent = new Intent(Intent.ACTION_CALL);
    phoneIntent.setData(Uri.parse("tel:91-000-000-0000"));
    if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
        return;
    }
    startActivity(phoneIntent);
}

Solution 9 - Android

If you are going to use a listener you will need to add this permission to the manifest as well.

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

Solution 10 - Android

To return to your Activity, you will need to listen to TelephonyStates. On that listener you can send an Intent to re-open your Activity once the phone is idle.

At least thats how I will do it.

Solution 11 - Android

Inside PhoneStateListener after seeing the call is finished better use:

Intent intent = new Intent(CallDispatcherActivity.this, CallDispatcherActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Where CallDispatcherActivity is the activity where the user has launched a call (to a taxi service dispatcher, in my case). This just removes Android telephony app from the top, the user gets back instead of ugly code I saw here.

Solution 12 - Android

  Intent callIntent = new Intent(Intent.ACTION_CALL);  
  callIntent.setData(Uri.parse("tel:"+number));  
   startActivity(callIntent);   

 **Add permission :**

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

Solution 13 - Android

Try using:

finish();

at the end of activity. It will redirect you to your previous activity.

Solution 14 - Android

When PhoneStateListener is used, one need to make sure PHONE_STATE_IDLE following a PHONE_STATE_OFFHOOK is used to trigger the action to be done after the call. If the trigger happens upon seeing PHONE_STATE_IDLE, you will end up doing it before the call. Because you will see the state change PHONE_STATE_IDLE -> PHONE_STATE_OFFHOOK -> PHONE_STATE_IDLE.

Solution 15 - Android

// in setonclicklistener put this code:

EditText et_number=(EditText)findViewById(R.id.id_of_edittext); 
String my_number = et_number.getText().toString().trim();
Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse(my_number)); 
startActivity(callIntent);

// give permission for call in manifest:

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

Solution 16 - Android

@Dmitri Novikov, FLAG_ACTIVITY_CLEAR_TOP clears any active instance on top of the new one. So, it may end the old instance before it completes the process.

Solution 17 - Android

Add this is your xml: android:autoLink="phone"

Solution 18 - Android

Steps:

1)Add the required permissions in the Manifest.xml file.

<!--For using the phone calls -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<!--For reading phone call state-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

2)Create a listener for the phone state changes.

public class EndCallListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
    if(TelephonyManager.CALL_STATE_RINGING == state) {
    }
    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.
    }
    if(TelephonyManager.CALL_STATE_IDLE == state) {
        //when this state occurs, and your flag is set, restart your app
    Intent i = context.getPackageManager().getLaunchIntentForPackage(
                            context.getPackageName());
    //For resuming the application from the previous state
    i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

    //Uncomment the following if you want to restart the application instead of bring to front.
    //i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    context.startActivity(i);
    }
}
}

3)Initialize the listener in your OnCreate

EndCallListener callListener = new EndCallListener();
TelephonyManager mTM = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
mTM.listen(callListener, PhoneStateListener.LISTEN_CALL_STATE);

but if you want to resume your application last state or to bring it back from the back stack, then replace FLAG_ACTIVITY_CLEAR_TOP with FLAG_ACTIVITY_SINGLE_TOP

Reference this Answer

Solution 19 - Android

   Intent callIntent = new Intent(Intent.ACTION_CALL);
   callIntent .setData(Uri.parse("tel:+91-XXXXXXXXX"));
   startActivity(callIntent );

Solution 20 - Android

When starting your call, it looks fine.

There is a difference between android 11+ and down in bringing your app to the front though.

Android 10 or less you need to start a new intent, android 11+ you simply use BringTaskToFront

In the call state IDLE:

if (Build.VERSION.SDK_INT >= 11) {
    ActivityManager am = (ActivityManager) activity.getSystemService(Activity.ACTIVITY_SERVICE);
    am.moveTaskToFront(MyActivity.MyActivityTaskId, ActivityManager.MOVE_TASK_WITH_HOME);
} else {
    Intent intent = new Intent(activity, MyActivity.class);
    activity.startActivity(intent);
}

I set the MyActivity.MyActivityTaskId when making the call on my activity like so, it this doesnt work, set this variable on the parent activity page of the page you want to get back to.

MyActivity.MyActivityTaskId = this.getTaskId();

MyActivityTaskId is a static variable on my activity class

public static int MyActivityTaskId = 0;

I hope this will work for you. I use the above code a bit differently, I open my app as soon as the call is answered sothat the user can see the details of the caller.

I have set some stuff in the AndroidManifest.xml as well:

/*Dont really know if this makes a difference*/
<activity android:name="MyActivity" android:taskAffinity="" android:launchMode="singleTask" />

and permissions:

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

Please ask questions if or when you get stuck.

Solution 21 - Android

To call from app use simple intent for call, after that if you want to listen the call status then use below code

1] implement this in your class -

> implements AudioManager.OnAudioFocusChangeListener

2] Add below code with overridden method

> AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); //public static final String AUDIO_SERVICE = "audio"; > audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); > assert audioManager != null; > audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, > AudioManager.AUDIOFOCUS_GAIN); > > @Override > public void onAudioFocusChange(int focusChange) { > switch (focusChange) { > case AudioManager.AUDIOFOCUS_LOSS: { > //here you can pause your playing audio > break; > } > case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: { > //here you can pause your playing audio > break; > } > case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: { > break; > } > case AudioManager.AUDIOFOCUS_GAIN: { > //here you will return back to the activity when your call is finsihed > //resume your audio here > break; > } > } > }

3]Add this

> @Override > public void onDestroy() { > audioManager.abandonAudioFocus(this); > }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionhap497View Question on Stackoverflow
Solution 1 - AndroidmoonlightcheeseView Answer on Stackoverflow
Solution 2 - AndroidPriaView Answer on Stackoverflow
Solution 3 - AndroidAndré LimaView Answer on Stackoverflow
Solution 4 - AndroidTheSolarSheriffView Answer on Stackoverflow
Solution 5 - AndroidyakrView Answer on Stackoverflow
Solution 6 - AndroidcikaboleView Answer on Stackoverflow
Solution 7 - AndroidOyeeView Answer on Stackoverflow
Solution 8 - AndroiderluxmanView Answer on Stackoverflow
Solution 9 - AndroidmartincmView Answer on Stackoverflow
Solution 10 - AndroidAimericView Answer on Stackoverflow
Solution 11 - AndroidDmitri NovikovView Answer on Stackoverflow
Solution 12 - Androidritesh4326View Answer on Stackoverflow
Solution 13 - AndroidAnkit KediaView Answer on Stackoverflow
Solution 14 - AndroidPonMaranView Answer on Stackoverflow
Solution 15 - AndroidHiren PatelView Answer on Stackoverflow
Solution 16 - AndroidPonMaranView Answer on Stackoverflow
Solution 17 - AndroidRoman MariusView Answer on Stackoverflow
Solution 18 - AndroidSami EltamawyView Answer on Stackoverflow
Solution 19 - AndroidDhina kView Answer on Stackoverflow
Solution 20 - AndroidPierreView Answer on Stackoverflow
Solution 21 - AndroidRahul KambleView Answer on Stackoverflow