gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Android开发四大组件之实现电话拦截和电话录音由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

1、问题描述 。

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

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

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

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

2、加入AIDL文件 。

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

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

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

3、编写TelReceiver组件 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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); //启动服务
  }
}

  注册广播:

?
1
2
3
4
5
6
<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>

4、编写ListenPhoneService组件 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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配置 。

?
1
2
3
4
5
< service
  android:name = ".ListenPhoneService"
  android:enabled = "true"
  android:exported = "true" >
</ service >

5、最后别忘了一些权限的设置 。

<!-- 添加访问手机电话状态的权限 --> <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开发四大组件之实现电话拦截和电话录音的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com