1

我正在做一个记录通话的应用程序(它们都是来电和去电)。

我刚刚解决了来电录音的问题,但我发现拨出电话有一些问题。

接下来是我的情况。我只想在接听电话时录制音频,但我不知道该怎么做。我刚刚尝试过使用 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;
        }
    }
}

在前面的代码中,当呼叫拨出时

4

2 回答 2

0

我认为没有任何非黑客/强大的方法可以找出对方何时接听电话。CALL_STATE_OFFHOOKMODE_IN_CALL( AudioManager) 都将在拨打电话后立即设置,而不是在对方应答时设置。

您可以做的是即时处理记录的下行链路数据,以尝试检测何时接听电话。希望对方会回答某种问候语,您可以尝试通过分析音频数据来确定对话何时开始来检测这些问候语。或者您可以查看上行链路并使用您对着麦克风说的第一个词作为对话已经开始的信号(因为您不太可能在对方回答之前开始说话)。

于 2012-07-26T14:38:28.100 回答
-1

我完全同意迈克尔的观点,没有可靠的方法来找出 android 中的 calle 何时应答呼叫。即电话管理器。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>
于 2013-03-01T09:40:31.867 回答