Как рассчитать длительность исходящего звонка (который я набрал из моего приложения) в Android программно
Я дал разрешение в manifest.xml
файл
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
И определить получателя:
<receiver android:name=".OutgoingCallReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
Файл получателя:
public class OutgoingCallReceiver extends BroadcastReceiver {
public static String TAG = "AUTODIAL";
static long start_time, end_time, call_duration;
String number;
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "intent get data : "+intent.getData(), Toast.LENGTH_LONG).show();
String action = intent.getAction();
String state=intent.getStringExtra(TelephonyManager.EXTRA_STATE);
Toast.makeText(context, "Phone State : "+state, Toast.LENGTH_LONG).show();
if(state==null) {
number=intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Toast.makeText(context, "Out going Phone number : "+number, Toast.LENGTH_LONG).show();
}
if (action.equalsIgnoreCase("android.intent.action.PHONE_STATE")) {
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
start_time = System.currentTimeMillis();
}
if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
end_time = System.currentTimeMillis();
}
call_duration = end_time - start_time;
}
}
Здесь он показывает всю длительность звонка, а не только те, которые я набрал в своем приложении.
И возможно ли вернуться к моему приложению после набора с него?
1 ответ
Ниже приведен код обнаружения исходящего звонка по событиям доступности -
Добавьте класс, который расширяет 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 не предоставляет никакого решения для определения ответа на вызов или нет, это лучшая альтернатива, которую я сделал, надеюсь, что она сработает для вас.