• 电话监听器


      电话监听器是通过服务来实现对电话录音的功能。通过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;
    	}
    	
    }
    
  • 相关阅读:
    redis持久化方案之RDB
    redis实现分布式锁
    redis数据类型(图解)
    js上拉加载
    apicloud直接上传图片
    layer.confirm
    json数组去重
    js解决手机键盘影响定位的问题
    click禁用事件
    ipcloud上传裁切图片,保存为base64再压缩传给后台
  • 原文地址:https://www.cnblogs.com/limingblogs/p/2218343.html
Copyright © 2020-2023  润新知