2012-07-26 43 views
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; 
     } 
    } 
} 

在前面的代碼,當呼叫傳出

回答

0

我不認爲有找出當呼叫已經被回答的任何非hackish的/可靠的方法另一方。 CALL_STATE_OFFHOOKMODE_IN_CALLAudioManager)都將在呼叫發出後立即設置,而不是在對方應答時設置。

您可以做的是處理記錄的下行數據,以嘗試檢測呼叫何時應答。希望對方會用某種問候語回答,你可以嘗試通過分析音頻數據來確定談話何時開始。或者您可以查看上行鏈路,並使用您對麥克風說的第一個單詞作爲對話已開始的信號(因爲您不可能在對方回答之前開始講話)。

-1

我完全同意邁克爾沒有強大的方式來找出什麼時候通過android中的calle回答了這個調用。即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> 
相關問題