android实现监听打电话并录音保存到本地

该Android示例展示了如何在6.0系统上监听电话并使用MediaRecorder进行录音,录音保存到本地。通过BroadcastReceiver监听开机启动,并启动监听服务。在电话状态变化时开始和停止录音。
   监听电话app
一.功能简介:
    本demo基于android 6.0实现对麦克风的录音,将录音保存到本地。利用广播监听开机启动,并开启监听服务。如果有兴趣,可以添加网络权限和上传功能到指定邮箱等等。
二. 代码简介
     1.StartPhoneBroadcast.java    本类用于监听开机启动事件,并开启监听服务。
  
 public void onReceive(Context context, Intent intent) {
        if(ACTION_BOOT.equals(intent.getAction())){
            //检测到系统开机
            Toast.makeText(context,"已开机",Toast.LENGTH_LONG).show();
            Intent service=new Intent();
            service.setClass(context, MyService.class);
            context.startService(service);
        }
    }
   注:ACTION_BOOT为自定义字符串private final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
 2.MyService.java类
    @Override
    public void onCreate() {
        super.onCreate();
        //获取电话管理器对象
        TelephonyManager telephonyManager= ( TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
       //设置电话监听器,监听电话状态
        telephonyManager.listen(new MyTelephoneListener(),PhoneStateListener.LISTEN_CALL_STATE);
    }
        //定义监听内部类实现监听录音
        class MyTelephoneListener extends PhoneStateListener{
            private  MediaRecorder recorder;
            private boolean record;
            private File audioFile;
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                super.onCallStateChanged(state, incomingNumber);
                switch (state){
                    case TelephonyManager.CALL_STATE_OFFHOOK:
                        recorder = new MediaRecorder();
                        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//从麦克风采集声音
                        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //内容输出格式
                        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                        //输出到缓存目录,此处可以添加上传录音的功能,也可以存到其他位置
                        audioFile = new File(getCacheDir(), "recoder"+ "_" + System.currentTimeMillis() + ".3gp");
                        recorder.setOutputFile(audioFile.getAbsolutePath());
                        try {
                            recorder.prepare();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        recorder.start();
                        record=true;
                        Log.i(tag,"电话已经摘机");
                        break;
                    case TelephonyManager.CALL_STATE_RINGING:
                        String mobile=incomingNumber;
                        Log.i(tag,"电话已响铃");
                        Log.i(tag,mobile+"来电");
                        break;
                    case TelephonyManager.CALL_STATE_IDLE:
                        if(record) {
                            recorder.stop(); //停止刻录
                            recorder.release(); //释放资源
                            Log.i(tag, "电话空闲");
                            record=false;
                        }
                        break;
                }
            }
        }
三.MainActivity类
  因为需要申请权限,所以在MainActivity中添加权限申请。
            Manifest.permission.READ_PHONE_STATE, //读取电话状态
            Manifest.permission.RECEIVE_BOOT_COMPLETED, //开机启动广播(不需要手动申请)
            Manifest.permission.WRITE_EXTERNAL_STORAGE, //读写SD卡
            Manifest.permission.RECORD_AUDIO        //录音权限

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        verifyStoragePermissions(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return super.onCreateOptionsMenu(menu);
    }
    private static final int READ_PHONE_STATE = 1;
    private static String[] CALLS_STATE = {
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.RECORD_AUDIO
    };
 
    public static void verifyStoragePermissions(Activity activity) {

        int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_PHONE_STATE);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(activity, CALLS_STATE , READ_PHONE_STATE);
        }

    }
四.在资源文件中配置

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="my.com.services01">
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">

            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
               <!-- 用于隐藏应用快捷图标-->
              <data android:host="MainActivity" android:scheme="my.com.Mainactivity" />
            </intent-filter>
        </activity>

        <service android:name="my.com.service.MyService">
        </service>

        <receiver android:name="my.com.broadcast.StartPhoneBroadcast" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

    </application>

</manifest>

五.总结
    本案例是用来学习监听电话录音的,由于录音只能识别麦克风的声音,所以只能录下自己说的话,如果需要录下对方的声音,需要在打电话的时候开启扬声器。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值