2011-10-28 4 views
2

Я следую примеру Record phone calls on android phone? и поставлю его на BroadcastReceiver, чтобы попытаться записать голос MIC (я знаю, что он по-прежнему ограничен для записи на другой стороне), когда телефон вызов входящего и исходящего. Мой вопрос: как я могу получить состояние, когда пользователь забирает телефон. Потому что, когда он звонит, он также перейдет к действию «android.intent.action.PHONE_STATE».Запись голоса (только MIC) при поступлении входящего или исходящего звонка

Мой код:

public class PhoneCallReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     String action = intent.getAction(); 
     if (action.equals("android.intent.action.PHONE_STATE") 
     { 
      // Phone call recording 
      try { 
       recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
       recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); 
       recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
       recorder.setOutputFile(<my output dir>); 
       recorder.prepare(); 
       recorder.start(); 
       recordStarted = true; 
       telManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
       telManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE); 
      } catch(Exception ex) { 

      } 
     } 
    } 
} 


private final PhoneStateListener phoneListener = new PhoneStateListener() { 
    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     try { 
      switch (state) { 
       case TelephonyManager.CALL_STATE_RINGING: { 
        // 
        break; 
       } 
       case TelephonyManager.CALL_STATE_OFFHOOK: { 
        // 
        break; 
       } 
       case TelephonyManager.CALL_STATE_IDLE: { 
        if (recordStarted) { 
         recorder.stop(); 
         recordStarted = false; 
        } 
        break; 
       } 
       default: { } 
      } 
     } catch (Exception ex) { 
     } 
    } 
}; 

код в AndroidManifest.xml

<receiver android:name=".PhoneCallReceiver" android:enabled="true"> 
    <intent-filter android:priority="1000"> 
     <action android:name="android.intent.action.PHONE_STATE" /> 
    </intent-filter> 
</receiver> 

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

на основе Android 2.1 SDK и испытано в HTC EVO 4G (Android 2.2)

ответ

0

Вы можете используйте действие android.intent.action.ANSWER вместо использования действия android.intent.action.PHONE_STATE. Вы можете записывать голос, когда на вызов отвечает.

+0

спасибо. Но я обнаружил, что он вызывает состояние TelephonyManager.CALL_STATE_OFFHOOK, когда я набираю телефонный звонок и умысел .getAction() никогда не становится android.intent.action.ANSWER, но всегда android.intent.action.PHONE_STATE. Btw, я разрабатываю с 2.1 SDK и тестирую его на Android 2.2 (HTC EVO 4G) –

1

Если вы хотите записывать голос с обоих концов использовать (в соответствии с Android Docs)

recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); 

Я не пробовал это, но надежда будет работать для вас и ответить на ваш вопрос, вы смотрели функцию getCallState() из TelephonyManager?

+0

Не думаю, что это работало на любом телефоне, включая телефоны Nexus. – Timmmm

Смежные вопросы