Есть ли способ узнать, принят ли исходящий вызов?

Я делаю приложение, которое записывает звонки (оба, входящие и исходящие звонки).

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

Моя ситуация следующая. Я хотел бы записывать звук только тогда, когда звонок принят, но я не знаю, как это сделать. Я только что попытался использовать класс PhoneStateListener, но состояние вызова не меняется, когда вызов принят. У меня есть следующий код:

package com.call.record.listeners;

import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;

public class OutgoingPhoneStateListener extends PhoneStateListener{

    private String phoneNumber;

    public OutgoingPhoneStateListener(String pn) {
        // TODO Auto-generated constructor stub
        super();
        phoneNumber = pn;
    }

    public void onCallStateChanged(int state, String incomingNumber){

        switch(state){
            case TelephonyManager.CALL_STATE_IDLE:
              Log.d("DEBUG", "IDLE");
            break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
              Log.d("DEBUG", "OFFHOOK");
            break;
            case TelephonyManager.CALL_STATE_RINGING:
              Log.d("DEBUG", "RINGING");
            break;
        }
    }
}

В предыдущем коде при исходящем вызове


person Juan Carlos Cámara    schedule 26.07.2012    source источник


Ответы (2)


Я не думаю, что есть какой-либо нехакерский/надежный способ узнать, когда на звонок ответила другая сторона. CALL_STATE_OFFHOOK и MODE_IN_CALL (AudioManager) будут установлены, как только вызов будет сделан, а не когда другой абонент ответит.

Что вы можете сделать, так это обработать записанные данные нисходящей линии связи на лету, чтобы попытаться определить, когда на вызов будет дан ответ. Будем надеяться, что другая сторона ответит каким-то приветствием, которое вы могли бы попытаться обнаружить, проанализировав аудиоданные, чтобы определить, когда начался разговор. Или вы можете посмотреть восходящую линию связи и использовать первое слово, которое вы говорите в микрофон, как сигнал о начале разговора (поскольку вы вряд ли начнете говорить до того, как собеседник ответит).

person Michael    schedule 26.07.2012

Я полностью согласен с Майклом, что нет надежного способа узнать, когда на звонок ответил абонент в Android. т. е. диспетчер телефонии. CALL_STATE_OFFHOOK будет установлен, как только вы позвоните.

попробуй этот пример поймешь

public class BroadcastReceiverImpl extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context, "Monitoring The Network !! ", Toast.LENGTH_LONG).show();
        PhoneStateListnerImpl phoneStateListnerImpl = new PhoneStateListnerImpl(context);
        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(context.TELEPHONY_SERVICE);

            telephonyManager.listen(phoneStateListnerImpl, PhoneStateListener.LISTEN_CALL_STATE);


        }

    private class PhoneStateListnerImpl extends PhoneStateListener{

        private Context mContext;

        public PhoneStateListnerImpl(Context mContext) {
            this.mContext = mContext;
        }


        @Override
        public void onCallStateChanged(int state, String incomingNumber) {

            switch (state) {

            case TelephonyManager.CALL_STATE_RINGING:
                 Toast.makeText(mContext, "Phone is Ringng ", Toast.LENGTH_LONG).show();

                break;

            case TelephonyManager.CALL_STATE_OFFHOOK:
                 Toast.makeText(mContext, "Phone is Answered ", Toast.LENGTH_LONG).show();

                break;

            case TelephonyManager.CALL_STATE_IDLE:
                 Toast.makeText(mContext, "Call Is Over ", Toast.LENGTH_LONG).show();

                 abortBroadcast();
                break;

            default:
                break;
            }
        }

    }
}

manifest :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.pervazive.monitor_network_v08"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <receiver
            android:name="com.example.broadcastreceiver.BroadcastReceiverImpl"
            android:enabled="true"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.ACTION_PHONE_STATE_CHANGED" />
                <action android:name="android.intent.action.ACTION_NEW_OUTGOING_CALL" />
                <action android:name="android.intent.action.PHONE_STATE" />
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
        </receiver>
    </application>

</manifest>
person Sachidananda Naik    schedule 01.03.2013