电话监听器是通过服务来实现对电话录音的功能。通过getSystemService(Context.TELEPHONY_SERVICE)获得电话服务,得到TelephonyManager对象manager,manager的listen方法需要一个PhoneStateListener类的对象,并重写onCallStateChanged方法,来监听电话的CALL_STATE_IDLE,CALL_STATE_RINGING,
CALL_STATE_OFFHOOK的三种状态。在电话接起的时候通过MediaRecorder的对象的一些方法进行录音,实现监听效果。
activity具体的代码如下:
package lm.myPhoneListener; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class MyPhoneListenerActivity extends Activity { /** Called when the activity is first created. */ private static final String ACTION = "lm.myPhoneListener.PhoneListenerService"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void startService(View view){//startService()或bindService()方法,服务也只被创建一次。 startService(new Intent(ACTION)); } public void stopService(View view){ stopService(new Intent(ACTION));//stopService和unbindService都能终止service 但是前者是立即终止,后者是使连接数减1 } }
服务代码如下:
package lm.myPhoneListener; import java.io.IOException; import android.app.Service; import android.content.Context; import android.content.Intent; import android.media.MediaRecorder; import android.os.Environment; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; public class PhoneListenerService extends Service{ private MediaRecorder mediaRecorder; private boolean recording = false;//记录录音状态 @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); /**这里的getSystemService和布局中的LayoutInflater方法相似 * LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.main, null); */ TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);//电话录音 manager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//电话监听者 } private PhoneStateListener listener = new PhoneStateListener(){//电话状态监听者 @Override public void onCallStateChanged(int state, String incomingNumber) { // TODO Auto-generated method stub super.onCallStateChanged(state, incomingNumber); switch(state){ case TelephonyManager.CALL_STATE_IDLE://电话空闲状态 stopRecording();//空闲时候不录音 break; case TelephonyManager.CALL_STATE_RINGING://电话响铃状态 break; case TelephonyManager.CALL_STATE_OFFHOOK://电话接起状态 recordCalling();//开始录音 break; default: break; } } }; private void stopRecording(){ Log.v("TAG", "stopRecording()"); if(recording){ mediaRecorder.stop();//录音停止 mediaRecorder.release();//释放资源 } } private void recordCalling(){ Log.v("TAG", "recordCalling()"); mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//从麦克风上采集声音 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//内容输出格式3gp mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//音频编码格式 mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + System.currentTimeMillis() + ".3gp");//存储格式及路径 try { mediaRecorder.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } mediaRecorder.start(); recording = true; } }