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

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

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

Возможный?

 Rob Lourens05 апр. 2012 г., 18:50
Вы можете получать журналы вызовов на Android и iOS или, если вас интересуют только вызовы, сделанные из приложения, как вы описываете, то вы можете проверить системное время.
 spentak05 апр. 2012 г., 18:46
Это то, что я пытаюсь выяснить. Позволяют ли платформы iOS и Android определять, когда закончился звонок?
 Josh Caswell05 апр. 2012 г., 19:30
Ответ будетwildly различный для каждой из этих платформ - нет никакого способа, которым код, применимый к одной, будет даже переносимым, не говоря уже о запуске. В таком случае, и так как вы уже получили и приняли ответ Android, я удалил теги iOS.
 Rob Lourens05 апр. 2012 г., 18:43
Если они начинают и заканчивают вызов в вашем приложении, можете ли вы просто проверить текущее время до и после вызова?

Ответы на вопрос(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" />
 28 июл. 2016 г., 14:42
@Akhil Я не знаю, даст ли это точные результаты, потому что TelephonyManager.EXTRA_STATE_RINGING - то, где вы получаете свое время начала, и это автоматически означает, что даже пропущенный вызов будет иметь продолжительность. Я бы подумал "CALL_STATE_OFFHOOK" это подходящее место для начала записи
 13 июл. 2013 г., 18:31
Тем не менее, вычисление продолжительности, подобной этой, будет включать в себя время срабатывания, что приведет к оценке превышения реальной продолжительности. Я тоже ищу решение этой проблемы, и кажется, что журнал вызовов - это единственное место, где можно найти точную информацию о продолжительности.
 04 янв. 2017 г., 19:15
это не может работать для исходящего звонка

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

Ваш ответ на вопрос