Android开发四大组件之实现电话拦截和电话录音_Android

一、问题描述

  使用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" />

好了,以上就是本文的全部所述,希望对大家学习android四大基本组件有所帮助,谢谢。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android四大组件
android中四大组件
android四大组件、安卓四大组件、四大组件、android四大组件详解、android的四大组件,以便于您获取更多的相关知识。

时间: 2024-07-30 10:03:14

Android开发四大组件之实现电话拦截和电话录音_Android的相关文章

Android开发四大组件Activity/Service/Broadcast Receiver/Content Provider详解

Android开发的四大组件一.Activity详解二.Service详解三.Broadcast Receiver详解四.Content Provider详解外加一个重要组件 intent的详解. 一.Activity详解 Activty的生命周期的也就是它所在进程的生命周期. 一个Activity的启动顺序: onCreate()-->onStart()-->onResume() 当另一个Activity启动时:第一个Activity onPause()-->第二个Activity  

一个帖子学会Android开发四大组件

原贴地址http://www.cnblogs.com/pepcod/archive/2013/02/11/2937403.html 写的非常不错.

Android编程四大组件分别是什么_Android

Android开发四大组件分别是:活动(Activity):用于表现功能.服务(Service):后台运行服务,不提供界面呈现.广播接收器(BroadcastReceiver):用于接收广播.内容提供商(ContentProvider):支持在多个应用中存储和读取数据,相当于数据库. 1.ActivityAndroid 中,Activity 是所有程序的根本,所有程序的流程都运行在Activity 之中,Activity可以算是开发者遇到的最频繁,也是Android 当中最基本的模块之一.在An

Android编程四大组件分别是什么

Android开发四大组件分别是:活动(Activity):用于表现功能.服务(Service):后台运行服务,不提供界面呈现.广播接收器(BroadcastReceiver):用于接收广播.内容提供商(ContentProvider):支持在多个应用中存储和读取数据,相当于数据库. 1.Activity Android 中,Activity 是所有程序的根本,所有程序的流程都运行在Activity 之中,Activity可以算是开发者遇到的最频繁,也是Android 当中最基本的模块之一.在A

《Android和PHP开发最佳实践》一2.4 Android系统四大组件

2.4 Android系统四大组件 之前我们已经学习了Android应用框架的四大核心要点,对Android的应用框架有了一个总体性的了解,接下来我们要学习Android应用程序中的四个重要组成部分,也就是我们一般所说的"应用组件".在前面讲解四大核心要点的篇幅中,我们曾经提到了控件(View控件)的概念,现在我们再来学习一下Android应用框架中的组件的概念.那么何谓组件呢?顾名思义,组件当然要比控件复杂,简而言之,组件是用于工业化组装的部件.要达到组件的标准,必须符合三个要求,以

Android编程四大组件之BroadcastReceiver(广播接收者)用法实例_Android

本文实例讲述了Android编程四大组件之BroadcastReceiver(广播接收者)用法.分享给大家供大家参考,具体如下: 这里介绍如何创建广播.如何发送一个无序广播和有序广播.以及监听短信以及监听呼出电话(当我们发短信和打电话,系统就会发一个广播,我们可以拦截此广播进行监听短信以及监听呼出电话). 定义广播接收者 1.定义类继承BroadcastReceiver,重写onReceive方法 2.当接收到匹配广播之后就会执行onReceive方法 3.清单文件中声明<receiver>,

【android基础】Android中四大组件

有些时候老是觉得自己有些浮躁,学习东西的时候总是太过于表面,只顾花哨的上层展示,难得去了解更别说深入的学习更下层的东西.回过头来看看,下层的东西搞明白之后再弄上层的会感觉豁然开朗.(当然刚刚入门的时候是可以从上层开始,这样有助于提高兴趣)不过还是应该对稍微底层一些的东西进行系统的学习和深入 Android系统的架构 android的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层.应用程序框架层.系统运行库层和linux核心层.1.应

Android编程四大组件之Activity用法实例分析_Android

本文实例讲述了Android编程四大组件之Activity用法.分享给大家供大家参考,具体如下: 这里详细介绍如何创建Activity.生命周期.内存管理.启动模式. 创建Activity 一.定义Activity 1. 定义Activity 定义类继承Activity 2.在AndroidManifest.xml的节点中声明<activity> 显式意图创建Activity三种方式方式 //第一种方式:构造函数,代码少 Intent intent1 =new Intent(this,NewA

Android编程四大组件之Activity用法实例分析

本文实例讲述了Android编程四大组件之Activity用法.分享给大家供大家参考,具体如下: 这里详细介绍如何创建Activity.生命周期.内存管理.启动模式. 创建Activity 一.定义Activity 1. 定义Activity 定义类继承Activity 2.在AndroidManifest.xml的节点中声明<activity> 显式意图创建Activity三种方式方式 //第一种方式:构造函数,代码少 Intent intent1 =new Intent(this,NewA