如何在Android中拨打电话并在通话结束后回到我的活动?

我正在启动一个打电话的活动,但是当我按下“结束通话”按钮时,它不会回到我的活动中。 你能告诉我怎样才能启动一个呼叫活动回来给我当“结束通话”按钮被按下? 这就是我打电话的方式:

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

使用PhoneStateListener来查看呼叫何时结束。 您很可能需要触发侦听器操作以等待该调用开始(等待,直到再次从PHONE_STATE_OFFHOOK更改为PHONE_STATE_IDLE),然后编写一些代码以将应用程序重新置于IDLE状态。

您可能需要在服务中运行侦听器以确保它保持运行状态,并重新启动您的应用程序。 一些示例代码:

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

监听器定义:

 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"); } } } 

在您的Manifest.xml文件中添加以下权限:

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

这是关于Starter问的问题。

你的代码的问题是你没有正确地传递数字。

代码应该是:

 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); } }; 

不要忘记在清单文件中添加权限。

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

要么

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

如果使用DIAL则为紧急号码。

我们遇到了同样的问题,通过使用PhoneStateListener来识别通话结束的时间,但是另外我们必须finish()原来的活动,然后再用startActivity重新开始,否则通话记录就会在前面。

我发现EndCallListener是功能最强大的示例,为了获得所描述的行为(finish(),call,restart),我添加了一些SharedPreferences,这样Listener就有了一个引用来管理这种行为。

我的OnClick,初始化和EndCallListener只响应来自应用程序的调用。 其他呼叫被忽略。

 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); } } } 

将这些添加到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> 

如果你需要回到调用之前的外观和感觉,你的清单中有这样的东西

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

并把这些放在你的“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() 

使用它来初始化你的onClick在myActivity中的行为,例如在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(); } 

你会发现点击你的电话号码列表完成你的活动,打电话给号码,并在通话结束时返回到你的活动。

在应用程序外部进行调用时,它不会重新启动您的活动(除非它与最后一个调用的BParty编号相同)。

🙂

你可以使用startActivityForResult()

从我的角度来看,这是一个解决方案:

 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); } 

当然,在Activity(类)定义中,你必须实现View.OnClickListener。

这里是我的例子,首先用户写入他/她想拨打的电话号码,然后按下通话按钮,然后直接拨打电话。 取消呼叫后,用户将被发送回应用程序。 为了这个按钮需要在xml中有一个onClick方法(在这个例子中是“makePhoneCall”)。 您还需要在清单中注册权限。

表现

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

活动

 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" /> 
 @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); } 

如果您要使用侦听器,则还需要将此权限添加到清单。

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

看到电话后PhoneStateListener完成更好用:

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

CallDispatcherActivity是用户发起呼叫(在我的情况下,是一个出租车服务调度员)的活动。 这只是从顶部删除Android电话应用程序,用户回来而不是我看到这里难看的代码。

要返回到您的Activity ,您将需要收听TelephonyStates 。 在该listener您可以发送一个Intent以便在电话空闲时重新打开您的Activity

至少这是我将如何做到这一点。

完美教程在这里 ! 总是检查这个博客,因为它有许多优秀的教程!

  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" /> 

尝试使用:

 finish(); 

在活动的结尾。 它会将您重定向到您之前的活动。

当使用PhoneStateListener ,需要确保在PHONE_STATE_IDLE之后的PHONE_STATE_OFFHOOK用于触发在调用之后完成的操作。 如果在看到PHONE_STATE_IDLE触发事件,您最终会在调用之前执行此操作。 因为您将看到状态更改PHONE_STATE_IDLE -> PHONE_STATE_OFFHOOK -> PHONE_STATE_IDLE.

/ /在setonclicklistener把这个代码:

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

//给清单中的电话提供许可:

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

@Dmitri Novikov,FLAG_ACTIVITY_CLEAR_TOP清除所有活动的实例。 因此,它可能会在完成该过程之前结束旧的实例。

添加这是你的xml: android:autoLink="phone"

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

更多的参考请点击这里http://androiddhina.blogspot.in/2015/10/how-to-make-phone-call-from-android.html

开始你的通话时,看起来很好。

Android 11+和下面的应用程序在前面虽然有区别。

Android 10或更少,你需要开始一个新的意图,你只需使用BringTaskToFront

在呼叫状态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); } 

当在我的活动上进行调用时,我设置了MyActivity.MyActivityTaskId ,但这不起作用,请在要返回的页面的父活动页面上设置此变量。

 MyActivity.MyActivityTaskId = this.getTaskId(); 

MyActivityTaskId是我的活动类的一个静态变量

 public static int MyActivityTaskId = 0; 

我希望这会对你有用。 我使用上面的代码有点不同,我打开我的应用程序,一旦接听电话,用户可以看到来电者的详细信息。

我也在AndroidManifest.xml设置了一些东西:

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

和权限:

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

如果您遇到困难,请提问。

脚步:

1)在Manifest.xml文件中添加所需的权限。

 <!--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)为电话状态变化创建一个监听器。

 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)初始化你的OnCreate的监听器

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

但是如果要恢复应用程序的最后状态或将其从后退堆栈中取出 ,请将FLAG_ACTIVITY_CLEAR_TOP替换为FLAG_ACTIVITY_SINGLE_TOP

引用这个答案