Отслеживание продолжительности телефонного звонка

Можно ли использовать телефон пользователей через своего оператора сотовой связи и отслеживать продолжительность телефонного звонка?

Итак, пользователь нажимает кнопку в приложении «Позвонить сейчас». Звонок начинается на заранее определенный номер. Записываем время начала. Когда звонок завершается, мы подсчитываем, сколько минут было использовано.

Возможно?


person spentak    schedule 05.04.2012    source источник
comment
Если они начинают и заканчивают звонок в вашем приложении, разве вы не можете просто проверить текущее время до и после звонка?   -  person Rob Lourens    schedule 05.04.2012
comment
Это то, что я пытаюсь выяснить. Позволяют ли платформы iOS и Android определять завершение вызова?   -  person spentak    schedule 05.04.2012
comment
Вы можете получать журналы вызовов на Android и iOS, или, если вас интересуют только вызовы, сделанные из приложения, как вы описываете, вы можете проверить системное время.   -  person Rob Lourens    schedule 05.04.2012
comment
Ответ будет сильно отличаться для каждой из этих платформ — нет никакого способа, чтобы код, применимый к одной из них, был даже переносимым, не говоря уже о запуске. В таком случае, и поскольку вы уже получили и приняли ответ Android, я удалил теги iOS.   -  person jscs    schedule 05.04.2012


Ответы (2)


Для расчета времени разговора как для входящих, так и для исходящих вызовов используйте следующий широковещательный приемник:

public class CallDurationReceiver extends BroadcastReceiver {

    static boolean flag = false;
    static long start_time, end_time;

    @Override
    public void onReceive(Context arg0, Intent intent) {
        String action = intent.getAction();
        if (action.equalsIgnoreCase("android.intent.action.PHONE_STATE")) {
            if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
            TelephonyManager.EXTRA_STATE_RINGING)) {
                start_time = System.currentTimeMillis();
            }
            if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
            TelephonyManager.EXTRA_STATE_IDLE)) {
                end_time = System.currentTimeMillis();
                //Total time talked =
                long total_time = end_time - start_time;
                //Store total_time somewhere or pass it to an Activity using intent
            }
        }
    }

Зарегистрируйте свой приемник в файле манифеста следующим образом:

 <receiver android:name=".CallDurationReceiver">
       <intent-filter>
           <action android:name="android.intent.action.PHONE_STATE" />
       </intent-filter>
    </receiver>

Также добавьте разрешение на использование:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
person Akhil    schedule 05.04.2012
comment
Тем не менее, вычисление продолжительности таким образом будет включать время срабатывания, что приведет к оценке превышения реальной продолжительности. Я тоже ищу решение этой проблемы, и кажется, что журнал вызовов - единственное место, где вы можете найти точную информацию о продолжительности. - person Riccardo T.; 13.07.2013
comment
@Akhil Я не знаю, даст ли это точные результаты, потому что TelephonyManager.EXTRA_STATE_RINGING — это место, где вы получаете время начала, и это автоматически означает, что даже пропущенный вызов будет иметь продолжительность. Я бы подумал, что «CALL_STATE_OFFHOOK» — подходящее место для начала записи. - person Zidane; 28.07.2016

Это может быть слишком поздно, но только для тех, кому это может понадобиться в будущем. Для исходящих вызовов вы можете прочитать продолжительность из CallLog. Для входящих вызовов вы можете рассчитать продолжительность на основе времени начала и окончания вызова.

person AAK    schedule 19.02.2018