监听来电且录音

功能:监听来电:当在通话状态时开启录音器
录取通话声音需要权限:<uses-permission android:name="android.permission.RECORD_AUDIO"/>
执行音频捕获的步骤:Audio Capture(从文档中直接翻译过来的)
1.android.media.MediaRecorder的创建一个新的实例。
2.使用MediaRecorder.setAudioSource设置音频源()。你可能会想useMediaRecorder.AudioSource.MIC。(设置音频源为麦克风)
3.设置输出文件格式使用MediaRecorder.setOutputFormat()。
4.设置输出文件名称使用MediaRecorder.setOutputFile()。
5.设置音频编码器使用MediaRecorder.setAudioEncoder()。
6.MediaRecorder实例上调用MediaRecorder.prepare()。
7.开始音频捕捉,叫MediaRecorder.start()。
8.停止音频捕捉,叫MediaRecorder.stop()。
9.当你完成了MediaRecorder实例,调用MediaRecorder.release()。
CallingMediaRecorder.release()总是建议立即免费资源。

服务类:

public class PhoneListenService extends Service {
    private TelephonyManager tm;//电话管理者
    private MyListener listener;//监听器
    private MediaRecorder mr;//录音机
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        //得到电话管理器
        tm=(TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        listener = new MyListener();//设置监听器
        tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//监听电话的状态
        System.out.println("开启了服务");
    }
    
    class MyListener extends PhoneStateListener{

        @Override//当电话的呼叫状态发生改变时回调的方法
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            //start:为0代表空闲,1代表来电,2代表在通话
            System.out.println("电话状态发生变化:"+state+"  打进来的号码:"+incomingNumber);
            switch (state) {
            case TelephonyManager.CALL_STATE_IDLE://=0
                if(mr!=null){
                    //第八步:停止录音
                    mr.stop();
                    //第九步:释放资源
                    mr.release();
                }
                break;
            case TelephonyManager.CALL_STATE_RINGING://=1
                    System.out.println("来电话了");        
                            break;
            case TelephonyManager.CALL_STATE_OFFHOOK://=2
                try {
                    mr = new MediaRecorder();
                    //第二步:设置音频源  如果是麦克风 音频源为:.MIC
                    mr.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
                    //第三步:设置录制的文件格式
                    mr.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
                    //第四步:设置输出文件名称使用MediaRecorder.setOutputFile()。
                    File file=new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp");
                    mr.setOutputFile(file.getAbsolutePath());
                    //第五步:设置音频编码器使用MediaRecorder.setAudioEncoder()。
                    mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
                    //第六步:准备录制
                    mr.prepare();
                    //第七步:开始音频捕捉
                    mr.start();
                }catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                break;
            default:
                break;
            }
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        tm.listen(listener, PhoneStateListener.LISTEN_NONE);//取消监听
        listener=null;
        System.out.println("关闭了服务");
    }
}

MainActivity:

//监听电话的状态需要读取电话状态的权限 
//<uses-permission android:name="android.permission.READ_PHONE_STATE" />
public class MainActivity extends Activity implements OnClickListener {
    private Button start;
    private Button stop;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        start = (Button) findViewById(R.id.start);
        stop = (Button) findViewById(R.id.stop);
        start.setOnClickListener(this);
        stop.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        Intent intent=new Intent(this, PhoneListenService.class);
        switch (v.getId()) {
            case R.id.start://开启服务
                startService(intent);
                break;
            case R.id.stop://关闭服务
                stopService(intent);
                break;
            default:
                break;
        }
    }
}

 

posted @ 2016-05-30 16:48  ts-android  阅读(1803)  评论(2编辑  收藏  举报