有没有办法知道,如果传出呼叫被接受?(Is there any way to know if an

2019-09-20 05:59发布

我在做一个应用程序,记录通话(他们两个,呼入和呼出)。

我刚刚解决了从记录来电音频的问题,但我发现一些麻烦与呼出。

我的情况是下一个。 我想录制音频只有当呼叫被接受,但我不知道该怎么做。 我只是试着使用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;
        }
    }
}

在前面的代码,当呼叫传出

Answer 1:

我不认为有找出当呼叫已经被对方回答任何非hackish的/可靠的方法。 CALL_STATE_OFFHOOKMODE_IN_CALLAudioManager )都将尽快进行呼叫时设置的,而不是对方应答时。

你可以做的是处理上即时记录下行数据来尝试当呼叫应答检测。 希望对方会以某种形式的问候,你可以尝试通过分析音频数据,以确定对话已经开始检测的回答。 或者你可以看看上行,并使用你说的第一个字到麦克风作为对话已经开始的信号(因为你不可能开始对方应答前说话)。



Answer 2:

我完全同意迈克尔有找出当呼叫已经在Android上的卡莱回答没有可靠的方法。 即TelephonyManager。 如您拨打一个电话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>


文章来源: Is there any way to know if an outgoing call is accepted?