ниже - код обнаружения исходящего звонка по событиям доступности -
Добавьте класс, который расширяет AccessibilityService
в ваших проектах -
public class CallDetection extends AccessibilityService {
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
acquireLock(this);
Log.d("myaccess","after lock");
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
Log.d("myaccess","in window changed");
AccessibilityNodeInfo info = event.getSource();
if (info != null && info.getText() != null) {
String duration = info.getText().toString();
String zeroSeconds = String.format("%02d:%02d", new Object[]{Integer.valueOf(0), Integer.valueOf(0)});
String firstSecond = String.format("%02d:%02d", new Object[]{Integer.valueOf(0), Integer.valueOf(1)});
Log.d("myaccess","after calculation - "+ zeroSeconds + " --- "+ firstSecond + " --- " + duration);
if (zeroSeconds.equals(duration) || firstSecond.equals(duration)) {
Toast.makeText(getApplicationContext(),"Call answered",Toast.LENGTH_SHORT).show();
// Your Code goes here
}
info.recycle();
}
}
}
@Override
protected void onServiceConnected() {
super.onServiceConnected();
Toast.makeText(this,"Service connected",Toast.LENGTH_SHORT).show();
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
info.notificationTimeout = 0;
info.packageNames = null;
setServiceInfo(info);
}
@Override
public void onInterrupt() {
}
}
Но для того, чтобы функция event.getSource()
работала, вы должны указать некоторую конфигурацию вашей службы через xml, поэтому создайте папку xml в своем проекте и добавьте XML-файл с именем serviceconfig.xml. (вы можете дать любое имя, какое захотите.
Содержание serviceconfig ниже -
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/callDetection"
android:accessibilityEventTypes="typeWindowContentChanged"
android:notificationTimeout="100"
android:canRetrieveWindowContent="true"
/>
Вы можете найти больше информации о serviceconfig в Здесь
Теперь добавьте свой сервис в вас Манифест файл, подобный этому -
<service android:name=".CallDetection"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:label="@string/callDetection">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/serviceconfig" />
</service>
И все готово, просто запустите приложение и перейдите к Настройки доступности в вашем телефоне, вы найдете опцию с именем обнаружения ( или любым другим именем, которое вы дали как описание вашего сервиса ), включите его, чтобы предоставить права доступа для вашего приложения.
Теперь вы увидите тост при ответе на звонок.
вы можете закодировать там любой код, который вы хотите, также вы можете вызвать функцию обратного вызова в вашей деятельности
Самое важное - Не вызывайте окно вызова (окно набора номера Android), пока на вызов не будет получен ответ, иначе это не будет работать.
Примечание - Поскольку Android не предоставляет никакого решения для определения ответа на вызов или нет, это лучшая альтернатива, которую я сделал, надеюсь, она подойдет вам.