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

 

相关文章:

  • 2022-12-23
  • 2022-01-21
  • 2021-11-29
  • 2022-12-23
  • 2022-12-23
  • 2021-09-08
  • 2021-11-15
  • 2022-02-20
猜你喜欢
  • 2022-01-06
  • 2021-06-01
  • 2021-06-30
  • 2021-09-16
  • 2022-01-15
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案