используйте 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.
Проблема с вашим кодом в том, что вы неправильно передаете номер.
Код должен быть:
Не забудьте добавить разрешение в файле манифеста.
или
для экстренного вызова используется номер в случае
DIAL
.источник
У нас была та же проблема, и нам удалось решить ее, используя
PhoneStateListener
для определения момента завершения вызова, но, кроме того, нам нужно было выполнитьfinish()
исходное действие перед его повторным запуском с помощьюstartActivity
, иначе журнал вызовов будет перед ним.источник
Я нашел EndCallListener наиболее функциональным примером, чтобы получить описанное поведение (finish (), call, restart), я добавил несколько SharedPreferences, чтобы у Listener была ссылка для управления этим поведением.
Мои OnClick, initialise и EndCallListener отвечают только на вызовы из приложения. Остальные вызовы игнорируются.
добавьте их в strings.xml
и что-то подобное в вашем манифесте, если вам нужно вернуться к виду и ощущениям до вызова
и поместите их в свой "myActivity"
используйте это, чтобы инициировать поведение вашего onClick в myActivity, например, после onCreate ()
Вы должны обнаружить, что щелчок по списку номеров телефонов завершает вашу деятельность, совершает звонок по номеру и возвращается к своей деятельности, когда звонок завершается.
Выполнение вызова из-за пределов вашего приложения, пока оно все еще работает, не перезапустит вашу деятельность (если только он не совпадает с последним набранным номером BParty).
:)
источник
вы можете использовать startActivityForResult ()
источник
С моей точки зрения, это решение:
Конечно, в определении Activity (класса) вы должны реализовать View.OnClickListener.
источник
Вот мой пример: сначала пользователь набирает номер, который хочет набрать, а затем нажимает кнопку вызова и перенаправляется на телефон. После отмены звонка пользователь возвращается в приложение. Для этого кнопка должна иметь метод onClick (в данном примере «makePhoneCall») в xml. Вам также необходимо зарегистрировать разрешение в манифесте.
манифест
Деятельность
XML
источник
источник
Если вы собираетесь использовать слушателя, вам также необходимо добавить это разрешение в манифест.
источник
Внутри PhoneStateListener, увидев, что звонок завершен, лучше использовать:
Где CallDispatcherActivity - действие, при котором пользователь совершил звонок (в моем случае диспетчеру службы такси). Это просто удаляет приложение телефонии Android сверху, пользователь возвращается вместо уродливого кода, который я здесь видел.
источник
((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)).listen(this, LISTEN_NONE);
Intent intentRestart = new Intent(ControlPanel.this, ControlPanel.class);
. Я должен указать, что PhoneStateListener также находится в ControlPanel. Т.е. моя цель - восстановить пользовательский интерфейс до того состояния, в котором он был до совершения телефонного звонка. Какие-либо предложения?Чтобы вернуться к своему
Activity
, вам нужно будет послушатьTelephonyStates
. На этомlistener
вы можете отправить,Intent
чтобы снова открыть вашActivity
телефон, когда он не используется.По крайней мере, так я и сделаю.
источник
источник
Попробуйте использовать:
в конце деятельности. Это перенаправит вас к вашей предыдущей деятельности.
источник
Когда
PhoneStateListener
используется, необходимо убедиться, чтоPHONE_STATE_IDLE
следующееPHONE_STATE_OFFHOOK
используется для запуска действия, которое будет выполнено после вызова. Если триггерPHONE_STATE_IDLE
сработает после просмотра , вы сделаете это до звонка. Потому что вы увидите изменение состоянияPHONE_STATE_IDLE -> PHONE_STATE_OFFHOOK -> PHONE_STATE_IDLE.
источник
((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)).listen(new PhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE)
будет продолжать прослушивать состояние телефона и быть активным до тех пор, пока он не будет явно остановлен с помощью((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)).listen(this, LISTEN_NONE)
// в setonclicklistener поместите этот код:
// даем разрешение на вызов в манифесте:
источник
@Dmitri Novikov,
FLAG_ACTIVITY_CLEAR_TOP
очищает любой активный экземпляр поверх нового. Таким образом, он может завершить старый экземпляр до того, как завершит процесс.источник
Добавьте это ваш xml:
android:autoLink="phone"
источник
шаги:
1) Добавьте необходимые разрешения в
Manifest.xml
файл.2) Создайте прослушиватель изменений состояния телефона.
3) Инициализируйте слушателя в своем
OnCreate
но если вы хотите возобновить последнее состояние вашего приложения или вернуть его из заднего стека , замените
FLAG_ACTIVITY_CLEAR_TOP
наFLAG_ACTIVITY_SINGLE_TOP
Ссылка на этот ответ
источник
для получения дополнительной информации нажмите здесь http://androiddhina.blogspot.in/2015/10/how-to-make-phone-call-from-android.html
источник
При звонке все выглядит нормально.
Однако есть разница между Android 11+ и предыдущей версией в том, чтобы вывести ваше приложение на передний план.
Android 10 или меньше, вам нужно начать новое намерение, Android 11+ вы просто используете
BringTaskToFront
В состоянии вызова IDLE:
Я установил
MyActivity.MyActivityTaskId
при вызове своего действия так, это не работает, установите эту переменную на родительской странице активности страницы, на которую вы хотите вернуться.MyActivityTaskId
статическая переменная в моем классе активностиЯ надеюсь, это сработает для вас. Я использую приведенный выше код немного по-другому, я открываю свое приложение, как только получен ответ на звонок, чтобы пользователь мог видеть данные о вызывающем абоненте.
Я также установил кое-что в
AndroidManifest.xml
:и разрешения:
Пожалуйста, задавайте вопросы, если или когда вы застряли.
источник