我在做一个应用程序,记录通话(他们两个,呼入和呼出)。
我刚刚解决了从记录来电音频的问题,但我发现一些麻烦与呼出。
我的情况是下一个。 我想录制音频只有当呼叫被接受,但我不知道该怎么做。 我只是试着使用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;
}
}
}
在前面的代码,当呼叫传出
我不认为有找出当呼叫已经被对方回答任何非hackish的/可靠的方法。 CALL_STATE_OFFHOOK
和MODE_IN_CALL
( AudioManager
)都将尽快进行呼叫时设置的,而不是对方应答时。
你可以做的是处理上即时记录下行数据来尝试当呼叫应答检测。 希望对方会以某种形式的问候,你可以尝试通过分析音频数据,以确定对话已经开始检测的回答。 或者你可以看看上行,并使用你说的第一个字到麦克风作为对话已经开始的信号(因为你不可能开始对方应答前说话)。
我完全同意迈克尔有找出当呼叫已经在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>