电话监听器是通过服务来实现对电话录音的功能。通过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;
}
}