package org.homeway.phonerecorder;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.media.MediaRecorder;import android.os.Environment;import android.telephony.TelephonyManager;import android.util.Log;import java.io.File;import java.io.IOException;/** * Created by Administrator on 15-2-27. */public class PhoneBroadcastReceiver extends BroadcastReceiver {    // 本机拨出的电话号码    private static String outgoingNumber;    // 来电的电话号码    private static String incomingNumber;    // 系统录音机    private static MediaRecorder mediaRecorder;    @Override    public void onReceive(Context context, Intent intent) {        String action = intent.getAction();        Log.d("PhoneBroadcastReceiver", "intent.getAction() = " + action);        // 如果是去电, 获取拨出的电话号码        if (action.equals(Intent.ACTION_NEW_OUTGOING_CALL)) {            outgoingNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);            Log.d("PhoneBroadcastReceiver", "outgoingNumber = " + outgoingNumber);        } else if (action.equals("android.intent.action.PHONE_STATE")) {            TelephonyManager tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);            int phoneState = tm.getCallState();            Log.d("PhoneBroadcastReceiver", "phoneState = " + phoneState);            switch (phoneState) {                case TelephonyManager.CALL_STATE_RINGING:                    incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);                    Log.d("PhoneBroadcastReceiver", "incomingNumber = " + incomingNumber);                    break;                case TelephonyManager.CALL_STATE_OFFHOOK:                    new Thread(){                        @Override                        public void run() {                            File dirFile = Environment.getExternalStorageDirectory();                            File file;                            if (null != incomingNumber && incomingNumber.length() > 0) {                                file = new File(dirFile, "IN_" + incomingNumber + "_" + System.currentTimeMillis() + ".amr");                            } else {                                file = new File(dirFile, "OUT_" + outgoingNumber + "_" + System.currentTimeMillis() + ".amr");                            }                            mediaRecorder = new MediaRecorder();//                            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);                            /**                             * !!! 红米note必须设置为VOICE_CALL才能收到声音.设置为其他类型时, 录音文件在播放时无声音.                             * !!! coolpad手机在设置为VOICE_CALL时, 执行mediaRecorder.start()时抛出异常. 若设置为DEFAULT或MIC时则程序正确执行.                             *///                            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);                            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);                            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);                            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);                            mediaRecorder.setOutputFile(file.getAbsolutePath());                            try {                                mediaRecorder.prepare();                                mediaRecorder.start();                                Log.d("PhoneBroadcastReceiver", "record file path = " + file.getAbsolutePath());                            } catch (IOException e) {                                e.printStackTrace();                                Log.e("PhoneBroadcastReceiver", e.getMessage());                                mediaRecorder = null;                            } catch (Exception e) {                                e.printStackTrace();                                Log.e("PhoneBroadcastReceiver", e.getMessage());                                mediaRecorder = null;                            }                        }                    }.start();                    break;                case TelephonyManager.CALL_STATE_IDLE:                    if (null != mediaRecorder) {                        mediaRecorder.stop();                        mediaRecorder.reset();                        mediaRecorder.release();                        mediaRecorder = null;                        incomingNumber = null;                        outgoingNumber = null;                    }                    Log.d("PhoneBroadcastReceiver", "finished!");                    break;            }        }    }}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="org.homeway.phonerecorder" >    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>    <uses-permission android:name="android.permission.RECORD_AUDIO"/>    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name=".MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <receiver android:name=".PhoneBroadcastReceiver">            <intent-filter>                <!-- 获取来电广播 -->                <action android:name="android.intent.action.PHONE_STATE"/>                <!-- 获取去电广播 -->                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>            </intent-filter>        </receiver>    </application></manifest>

更多相关文章

  1. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
  2. android位置服务GPS经纬度获取
  3. android之手机震动Vibrate
  4. android判断用户网络类型
  5. Android获取、设置音频的音量大小
  6. android捕获全局异常,CrashHandler
  7. Android实现复制粘贴功能
  8. Android动态添加Fragment
  9. Android(安卓)从网上获取图片

随机推荐

  1. LeetCode数据库篇|181超过经理收入的员工
  2. Scrapy爬虫实战| 手把手教你使用CrawlSpid
  3. 520|解锁Python表白新姿势
  4. Android(安卓)Studio真机测试时生成的程
  5. Python办公自动化|批量处理文件,一学就会
  6. 想做疫情分析却没有数据?看这篇就够了
  7. Python办公自动化|光速对比并提取两份Word
  8. Selenium自动化|爬取公众号全部文章,就是这
  9. Python办公自动化|自动更新表格,告别繁琐
  10. 收藏| Scrapy框架各组件详细设置