码迷,mamicode.com
首页 > 移动开发 > 详细

Android四大组件应用系列——实现电话拦截和电话录音

时间:2015-10-20 09:08:47      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:

一、问题描述

  使用BordercastReceiver和Service组件实现下述功能:

1.当手机处于来电状态,启动监听服务,对来电进行监听录音。

2.设置电话黑名单,当来电是黑名单电话,则直接挂断。

  当拨打电话或电话状态发生改变时,系统就会发出有序广播,因此我们可以使用BordercastReceiver接受广播,因BordercastReceiver执行时间短不能执行耗时任务也不能使用子线程,因此我们应启动一个Service来监听电话并进行处理

二、加入AIDL文件

  Android没有对外公开结束通话的API,要结束通话就必须使用AIDL与电话管理服务进行通信,并调用服务中的API实现结束通话,这样需要android 源码文件NeighboringCellInfo.aidl和ITelephony.aidl添加到项目中,如图所示:

 技术分享

Android Studio 会自动编译产生对应的类文件

三、编写TelReceiver组件
public class TelReceiver extends BroadcastReceiver {
    public TelReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent i=new Intent(context,ListenPhoneService.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        i.setAction(intent.getAction());
        i.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER,
                intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER));//电话号码
        i.putExtra(TelephonyManager.EXTRA_STATE,
                intent.getStringExtra(TelephonyManager.EXTRA_STATE));//电话状态
        context.startService(i);//启动服务
    }
}

  注册广播:

<receiver android:name=".TelReceiver" >
    <intent-filter android:priority="1000" >
        <action android:name="android.intent.action.PHONE_STATE" />
        <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
    </intent-filter>
</receiver>
四、编写ListenPhoneService组件
public class ListenPhoneService  extends  Service {
    private  AudioManager mAudioManager;
    private TelephonyManager tm;
    public ListenPhoneService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mAudioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
        tm=(TelephonyManager)getSystemService(Service.TELEPHONY_SERVICE);
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){//去电广播,android没有来电话广播
        }else{//去掉拨打电话就是来电状态了
  //方法1
//获得来电电话
// String number=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
//获得电话状态
// String state=intent.getStringExtra(TelephonyManager.EXTRA_STATE);
//            Log.d("jereh", "incoming phone:" + number);
//            Log.d("jereh","call state:"+state);
//            TelephonyManager.EXTRA_STATE_IDLE: 没有来电 或者 挂断
//            TelephonyManagerEXTRA_STATE_OFFHOOK: 接起电话
//            TelephonyManager.EXTRA_STATE_RINGING:当电话呼入时,响铃时
//           if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){
//           if(number.equals("13280998858")){//拦截指定的电话号码
//               mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
//               Log.d("jereh","电话被拦截");
//              stopCall();
//                    mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);//恢复铃声
//                }
//            }else if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
        //接起电话
//                recordCall();//开始录音
//            }else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
//                stopCall();//停止录音
//            }
 //方法2
            // 设置一个监听器,监听电话状态
            tm.listen(listener,PhoneStateListener.LISTEN_CALL_STATE);
        }

        return super.onStartCommand(intent, flags, startId);
    }

    /**
     * 挂断电话
     */
    private void stopCall(){
        try {
            //Android的设计将ServiceManager隐藏了,所以只能使用反射机制获得。
            Method method=Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
            IBinder binder=(IBinder)method.invoke(null, new Object[]{"phone"});//获得系统电话服务
            ITelephony telephoney=ITelephony.Stub.asInterface(binder);
            telephoney.endCall();//挂断电话
            stopSelf();//停止服务
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    PhoneStateListener listener=new PhoneStateListener(){
        @Override
        public  void onCallStateChanged(int state,String incomingNumber){
            switch (state){
                //手机空闲了
                case TelephonyManager.CALL_STATE_IDLE:
                     stopCall();//停止录音
                    break;
                //接起电话
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    recordCall();//开始录音
                    break;
                // 响铃时
                case TelephonyManager.CALL_STATE_RINGING:
                    Log.e("jereh", "来电号码是:"+ incomingNumber);
                    // 如果该号码属于黑名单
                    if (incomingNumber.equals("123456")) {
                        // 如果是黑名单,就进行屏蔽
                        stopCall();
                    }
                    break;
            }
        }
    };

    /**
     * 停止录音
     */
    private void stopRecord(){
        if(recording){
            recorder.stop();
            recorder.release();
            recording=false;
            stopSelf();//停止服务
        }
    }
    /**
     * 电话录音
     */
    private MediaRecorder recorder;
    private boolean recording ;
    private void recordCall(){
        Log.d("jereh", "record calling")
  if( Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
       recorder=new MediaRecorder();
       recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//读麦克风的声音
       recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置输出格式
       recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 编码方式
       File file=new    File(Environment.getDownloadCacheDirectory().getAbsolutePath(),"recorder");
      if(!file.exists()){
                file.mkdir();
       }
   recorder.setOutputFile(file.getAbsolutePath() + "/"
   + System.currentTimeMillis() + "3gp");// 存放的位置是放在sd卡recorder目录下
    try {
            recorder.prepare();
            recorder.start();
            recording=true;

       } catch (IOException e) {
                e.printStackTrace();
      }
      }
 }
    @Override
    public IBinder onBind(Intent intent) {
         throw new UnsupportedOperationException("Not yet implemented");
    }
}
Service XML配置
<service
    android:name=".ListenPhoneService"
    android:enabled="true"
    android:exported="true" >
</service>
五、最后别忘了一些权限的设置
<!-- 添加访问手机电话状态的权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 拨打电话权限 -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<!-- 监听手机去电的权限 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/ 
版权声明:本文版权归杰瑞教育技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
技术咨询:技术分享
 

Android四大组件应用系列——实现电话拦截和电话录音

标签:

原文地址:http://www.cnblogs.com/jerehedu/p/4885850.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!