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

来源:互联网 发布:淘宝hot怎么收费 编辑:程序博客网 时间:2024/05/16 07:37
   监听电话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>

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


0 0
原创粉丝点击