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

后端 未结 20 2139
北恋
北恋 2020-11-22 12:59

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 c

相关标签:
20条回答
  • 2020-11-22 13:13
       Intent callIntent = new Intent(Intent.ACTION_CALL);
       callIntent .setData(Uri.parse("tel:+91-XXXXXXXXX"));
       startActivity(callIntent );
    
    0 讨论(0)
  • 2020-11-22 13:14

    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"/>
    
    0 讨论(0)
  • 2020-11-22 13:19

    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" />
    
    0 讨论(0)
  • 2020-11-22 13:20

    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).

    :)

    0 讨论(0)
  • 2020-11-22 13:23

    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.

    0 讨论(0)
  • 2020-11-22 13:23
    @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);
    }
    
    0 讨论(0)
提交回复
热议问题