【android基础篇】自定义广播和电话监听

I,自定义广播

前面所说的都是接收短信,外拨电话等都是系统所有的广播,而其实我们可以自己自定义一个广播,并且写一个广播接收者来玩玩。

1)

在按钮的点击方法中,发送自定义的广播:

1 public void click(View view){
2         /**
3          * 发送自定义的广播
4          */
5         Intent intent=new Intent();
6         //设置意图的动作,要和自定义的频道要一致
7         intent.setAction("www.wangchengxiang.com");
8         sendBroadcast(intent);
9 }

setAction方法,理解为设置意图的活动,也就是广播接收者需要接收的频道。

发送自定义广播,光代码也就这么几行,其实发送广播的方法就有好几种,且它们之间都有很大的差别。

2)

sendBroadcast(intent);

它发送的是无序广播,特点就是任何广播接收者都可以接收到这个广播。

sendOrderedBroadcast(intent, receiverPermission);

它发送的是有序广播,广播接收者会让优先级的次序依次的接收到广播。上篇在广播接收者的配置中有过优先级的配置,关于优先级,最大值为1000,最小为-1000,默认的为0.

而receiverPermission表示的是广播接收者的权限,如果不关心,写为null。

当发送的是有序广播时,比如有多个广播接收者都有接收到,如果在高优先级的广播接收者中,执行abortBroadCast()方法,那么低优先级的广播接收者将不会触发onReceive方法。

所以为了防止,有恶意的广播接收者,故意中断广播,又诞生出另一种方法,可以指定某个广播接收者一定要接收到广播。

sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras)

resultReceiver参数表示的就是一定会接收到的广播接收者,即使在高优先级的广播接收者中,中断了广播,这个广播接收者也会执行到。

那么为什么google的工程师要这么做呢?

比如打电话,就可以认为是一个广播接收者,如果有高优先级的广播接收者中断了广播,那么默认为0的电话广播接收者岂不是不能打电话,而打电话对于我们是多么的重要。

所以有的时候,这个方法会派上大用场。

II,电话监听

1)

四大组件的最后一个Service,表示的是服务之意,也引申于window下的服务。

安卓下的服务的特点:长期运行在后台,没有界面的应用程序。

服务最大的特点也是这两点,长期运行在后台,有的应用就特别适合用服务去实现,比如天气预报,它可以长期隔一段时间去服务器获取天气信息。

所以总结而来,服务可以用来做一些后台监听和获取数据等操作。

接下来就用电话监听来谈谈服务。

2)

定义一个类实现Service,并在清单文件中配置,这样一个服务类就建立。在服务类下,先了解几个方法:

onCreate,服务创建就会调用,onDestroy,服务销毁会调用。

在activity类中开启服务:

1        /**
2          * 指定开启的服务的名称。
3          * 开启服务
4          */
5         Intent intent=new Intent(this,PhoneService.class);
6         startService(intent);        

当开启服务后,就会去调用onCreate方法,我们就可以在该方法中获取到电话的状态。

要获取电话状态的变化,就需要管理电话的服务,那么如何获取管理电话的服务,这里要通过电话管理器。

TelephonyManager tm=(TelephonyManager) getSystemService(TELEPHONY_SERVICE);
tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);

第一行代码表示:获取到管理电话服务的电话管理器。

第二行代码表示当电话状态改变时(PhoneStateListener.LISTEN_CALL_STATE),会回调MyListener中的方法。

而MyListener继承自PhoneStateListener。当通话状态发生变化时,就会调用MyListener中的方法,附上MyListener代码:

 1 private class MyListener extends PhoneStateListener{
 2         /**
 3          * 定义一个收音机
 4          */
 5         private MediaRecorder recorder;
 6         /**
 7          * 手机的通话状态发生变化时,会去调用
 8          */
 9         @Override
10         /**
11          * state:电话状态
12          * incomingNumber:来电的电话
13          */
14         public void onCallStateChanged(int state, String incomingNumber) {
15             try {
16                 switch(state){
17                 case TelephonyManager.CALL_STATE_IDLE://通话空闲的状态
18                     //结束录音操作,录制的音频文件上传到服务器
19                     if(recorder!=null){
20                         recorder.stop();
21                         recorder.reset();
22                         recorder.release();
23                     }
24                      break;
25                 case TelephonyManager.CALL_STATE_RINGING://响铃的状态
26                     System.out.println("发现来电号码:"+incomingNumber);
27                     recorder = new MediaRecorder();
28                     /**
29                      * 设置录制的音频源MIC:表示从话筒中获取声音。标准的手机操作系统是不支持录音的。国产的山寨机可以录制。
30                      */
31                     recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
32                     /**
33                      * OutputFormat:文件格式。THREE_GPP:3gp的格式
34                      */
35                     recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
36                     /**
37                      * AudioEncoder:声音编码的方式
38                      */
39                     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
40                     /**
41                      * 录制的声音写到哪里,参数为文件的路径。这里写到sd卡中,当然也可以上传到服务器上。
42                      */
43                     recorder.setOutputFile("/sdcard"+System.currentTimeMillis()+".3gp");
44                     /**
45                      * 通知录音机准备开始录制
46                      */
47                     recorder.prepare();
48                     /**
49                      * 开始录制
50                      */
51                     recorder.start();
52                     break;
53                 case TelephonyManager.CALL_STATE_OFFHOOK://通话状态
54                     /**
55                      * 当手机接到电话时,HOME键,后退键,菜单键都是没效的。
56                      * 只有接通或挂断,才会生效。
57                      */
58                     if(recorder!=null){
59                         recorder.start();
60                     }
61                     break;
62                     default:
63                         break;
64                 }
65             } catch (Exception e) {
66                 e.printStackTrace();
67             }
68             super.onCallStateChanged(state, incomingNumber);
69         }
70     }

通过以上,就可以实现电话窃听。

时间: 2024-10-06 02:00:33

【android基础篇】自定义广播和电话监听的相关文章

android基础之如何实现触屏监听和鼠标点击事件

直接上代码: android基础之如何实现触屏监听和鼠标点击事件

Android基础入门教程——3.1 基于监听的事件处理机制

Android基础入门教程--3.1.1 基于监听的事件处理机制 标签(空格分隔): Android基础入门教程 本节引言: 第二章我们学习的是Android的UI控件,我们可以利用这些控件构成一个精美的界面,但是仅仅是界面而已:下一步就要开始学习逻辑与业务实现了,本章节讲解的是Android的事件处理机制!何为事件处理机制?举个 简单的例子,比如点击一个按钮,我们向服务器发送登陆请求!当然,Android中的事件处理机制不止这一种, 比如屏幕发生选择,我们点击了屏幕上某个区域-简单点说,事件处

【android基础篇】利用广播接收者实现ip拨号和短信窃取的效果

I,广播接收者 广播接收者BroadCastReceiver,怎么理解广播接收者? 系统中,有很多特殊的事件,比如sd卡挂载,外拨电话,接收短信等事件.我们只要注册一个广播接收者,相当于买了个收音机,就可以接收到这些特殊事件. 这些事件,当发生时,总会向外发出广播. II,实现IP拨号 1) 效果:输入一个号码,被当做是ip号码存储起来.等到拨打电话时,加上这个号码,拨打出去. ip号码,可以存储在sharedPreferences中.最关键的是,需要写一个广播接收者,当发生外拨电话这种事件时,

android的电话监听

android的电话监听 新建一个项目,结构图如下: PhoneService: package com.demo.tingdianhua; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.telecom.TelecomManager; import android.telephony.PhoneStateListener; import an

C# Socket基础(一)之启动异步服务监听

本文主要是以代码为主..NET技术交流群 199281001 .欢迎加入. //通知一个或多个正在等待的线程已发生事件. ManualResetEvent manager = new ManualResetEvent(false); 1 //负责监听的套接字 private Socket socketServer; 2 /// <summary> 3 /// 启动服务 4 /// </summary> 5 private void CreateSocketService() 6 {

赵雅智_BroadcastReceiver电话监听

AndroidManifest.xml 注冊广播接收者 加入权限 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android_ipphone" android:versionCode="1

赵雅智_service电话监听2加接通电话录音

步骤: 创建CallStateService继承Service 取得电话服务 监听电话动作 电话监听的对象 没有电话时 停止刻录 重设 刻录完成一定要释放资源 电话响铃时 从麦克风采集声音 内容输出格式 音频编码方式 获取sd卡目录并存入 电话接通时 开始录制 电话监听的行为 启动service 注册service并添加监听电话状态的权限 监听电话状态权限 sd卡读写权限 音频录制权限 AndroidManifest.xml <?xml version="1.0" encodin

Android USB大容量存储时SD卡状态监听(转)

对SD卡状态监听,到现在为止我知道的有两种方式: 1.注册StorageEventListener来监听sd卡状态 StorageEventListener中有onStorageStateChanged()方法,当sd卡状态改变时,此方法会调用,对各状态的判断一般会用到Environment类,此类中包含的有关sd卡状态的常量有: MEDIA_BAD_REMOVAL:表明SDCard 被卸载前己被移除 MEDIA_CHECKING:表明对象正在磁盘检查 MEDIA_MOUNTED:表明sd对象是

Android基础篇之Android快速入门--你必须要知道的基础

Android快速入门 1. 搭建开发环境 >解压压缩文件,得到:①Android SDK   (类似于JDK)② Eclipse  ③ADT >配置两个path环境变量:D:\adt-bundle-windows-x86\sdk\platform-tools:D:\adt-bundle-windows-x86\sdk\tools >配置基本的Eclipse的设置: 调整字体大小,字符集,配置android sdk的位置 >创建模拟器: 2. 创建第一个Android项目: Hel