Android Service 电话录音机

来源:互联网 发布:linux web性能测试 编辑:程序博客网 时间:2024/04/28 06:37

项目简介:

该项目接听电话的时候实现自动录音

详细介绍:

项目安装后,启动该服务,开机的时候该服务也会自动启动。当用户接听电话的时候,该服务会自动调用录音机,将用户语音全部录下来,放在SD卡中保存起来

该应用涉及到的知识有:

  • 1.Android的四大组件之一:Service的使用
    Service可以看做是一个没有前台界面的Activity
  • 2.如何调用手机中的录音服务
    在手机响铃状态初始化录音机
    在摘机状态开启录音机
    在空闲状态释放录音机资源
  • 3.如何在手机开机的时候就启动服务
    通过开机时广播接收者接受开机完成的广播后,然后启动服务

注意:

  • 1.监听用户电话的状态需要添加权限
<uses-permission android:name="android.permission.READ_PHONE_STATE" />  
  • 2.调用录音机需要添加用户权限
<uses-permission android:name="android.permission.RECORD_AUDIO" />      
  • 3.该项目最好在4.0模拟器上运行,在4.3以后的模拟器上运行可能会出问题。因为4.3以后的模拟器上去掉了拨号功能,所以可能录音的文件的大小一直是0,导致录音失败

步骤:

1.创建一个Android项目,在该项目中新建一个服务RecorderService:

public class RecorderService extends Service {    @Override    public IBinder onBind(Intent intent) {        // TODO Auto-generated method stub        return null;    }    // 创建Service对象时调用    @Override    public void onCreate() {        super.onCreate();        // 拿到电话管理器        TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);        // 监听电话状态        // 第二个参数events表示需要监听的事件.        // STEN_CALL_STATE表示只侦听电话状态的改变        tm.listen(new MyListen(), PhoneStateListener.LISTEN_CALL_STATE);    }    class MyListen extends PhoneStateListener {        private MediaRecorder recorder = null;        // PhoneStateListener中有许多方法,可以查看API文档查看各个方法的作用        // 一旦电话状态改变,此方法调用        // state表示当前电话的状态,电话状态分为三种:响铃、空闲、摘机(即接听)        @Override        public void onCallStateChanged(int state, String incomingNumber) {            super.onCallStateChanged(state, incomingNumber);            switch (state) {            case TelephonyManager.CALL_STATE_IDLE:                // 空闲状态,释放资源                // Android的资源是自动释放的(因为java机制),但是录音是使用C语言调用硬件,C语言会占用很多资源,所以要手动释放一下                if (recorder != null) {                    recorder.stop();                    Log.i("HHH", "录音机停止");                    recorder.release();                    Log.i("HHH", "录音机释放");                    recorder = null;                }                break;            case TelephonyManager.CALL_STATE_RINGING:                // 响铃状态,初始化录音机                // 如果录音机为空,就初始化,不为空就直接使用                if (recorder == null) {                    recorder = new MediaRecorder();                    // 设置声音来源,MIC表示来源是麦克风。也可以选择其他的来源。                    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);                    // 设置输出格式                    // THREE_GPP:3GP格式,该格式既可以是音频,也可以是视频,Android中默认的都是这个格式,也可以自己设置为其他格式                    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);                    // 设置文件的名字                    recorder.setOutputFile(Environment.getExternalStorageDirectory().getPath() + "/recorder.3GP");                    // 设置音频编码                    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);                    // 初始化完毕                    try {                        recorder.prepare();                    } catch (Exception e) {                        e.printStackTrace();                    }                    Log.i("HHH", "初试化录音机完毕");                }                break;            case TelephonyManager.CALL_STATE_OFFHOOK:                // 摘机状态,开启recorder                if (recorder != null) {                    recorder.start();                    Log.i("HHH", "录音机开启");                }                break;            }        }    }}

2.由于要求开启启动,所以穿点一个广播接收者,使得每次开机完成后就启动该项目

public class BootReceiver extends BroadcastReceiver {    // 开机启动录音服务    @Override    public void onReceive(Context context, Intent intent) {        Intent it = new Intent(context, RecorderService.class);        // 服务是没有前台界面的,所以尽管是在上下文外跳转到服务,但是不需要创建任务栈        context.startService(it);    }}

3.在清单文件中注册服务:

        <service android:name=".RecorderService" >        </service>

由于在项目中监听了用户的电话状态,调用了系统的麦克风以及系统的录音机,往SD卡中写入的数据,接收了开机广播,所以需要添加用户权限:

 <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.RECORD_AUDIO" />    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
0 0
原创粉丝点击