来电监听功能的实现--基于服务的应用

需求

利用电话监听器,在接通电话时开启录音,挂断时保存

步骤

1.创建服务并注册监听器
2.在接通电话时初始化录音设备
3.挂断后保留到指定的文档地址中

代码实现

活动界面代码

/**
 * 电话的监听功能
 */
public class MainActivity extends AppCompatActivity {

    private  Intent service;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        service = new Intent(this, TelPhonListener.class);
        //动态申请权限
        List<String> permissionList = new ArrayList<>();
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE)!=
                PackageManager.PERMISSION_GRANTED){
            permissionList.add(Manifest.permission.READ_PHONE_STATE);
        }
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!=
                PackageManager.PERMISSION_GRANTED){
            permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }else {
            startService(service);
        }

    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        switch (requestCode){
            case 1:
                if (grantResults.length > 0){
                    for (int result :grantResults){
                        if (result !=PackageManager.PERMISSION_GRANTED){
                            Toast.makeText(this,"必须同意所有权限才能使用本程序",
                                    Toast.LENGTH_LONG).show();
                            finish();
                            return;
                        }
                    }
                    startService(service);
                }else {
                    Toast.makeText(this,"未知错误",
                            Toast.LENGTH_LONG).show();
                    finish();
                }
                break;
            default:
        }
    }
}

服务器代码

/**
 * 获取电话管理器
 */
@Override
public void onCreate() {
    super.onCreate();
    TelephonyManager manager = (TelephonyManager) 	getSystemService(TELEPHONY_SERVICE);
    //注册来电监听器,event是只监听接听状态事件
    manager.listen(new MyPhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE);

}

电话状态类

public void onCallStateChanged(int state, String phoneNumber) {
    switch (state){
        case TelephonyManager.CALL_STATE_IDLE://闲置
            Log.d("PHoneState", "当前电话处于闲置状态");
            if (isCall){//状态由摘机转换到闲置
                recorder.stop();
                recorder.release();
                Log.d("PHoneListener", "录制完成");
            }
            isCall =false;

            break;
        case TelephonyManager.CALL_STATE_OFFHOOK://摘机
            Log.d("PHoneState", "当前电话处于摘机状态");
            //初始化录音设备
            recorder = new MediaRecorder();
            //进行一系列初始化设置,1.设置指定音频输入源---麦克风
            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            //设置输出格式为3pp
           recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
           //指定音频编码模式
            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
            //输出地址-以时间为文件名
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss");
            //每次执行的时间都不相同,所有格式化的名称也不相同
            String name = format.format(new Date());
            String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) +
                    File.separator+name+".3pp";
            //指定输出位置
            recorder.setOutputFile(path);
            Log.d("PHoneListener", "path :"+path);
            try {
                recorder.prepare();
                recorder.start();
                isCall = true;
                Log.d("PHoneListener", "录音设备设置完成,已启动");
            } catch (IOException e) {
                e.printStackTrace();
            }

            break;
        case TelephonyManager.CALL_STATE_RINGING://响铃
            Log.d("PHoneState", "当前电话处响铃状态");
            break;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值