[Android] 来电归属地查询的实现思路

2023-10-29 04:18

本文主要是介绍[Android] 来电归属地查询的实现思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



想要监听来电首先需要要manifest中申明"android.permission.READ_PHONE_STATE"权限


<uses-permission android:name="android.permission.READ_PHONE_STATE"/>  

还需要注册来电监听,目前我的处理方式是接收开机广播,然后在接收到广播后注册来电监听。接收开机广播需要有“android.permission.RECEIVE_BOOT_COMPLETED”权限,manifest中申明如下

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

然后注册广播接收类

<receiver android:name=".PhoneBootReceiver">  <intent-filter>  <action android:name="android.intent.action.BOOT_COMPLETED" />  </intent-filter>  
</receiver> 

PhoneBootReceiver中注册监听来电,首先得获取系统服务“TELEPHONY_SERVICE”


TelephonyManager telM = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
然后添加监听
telM.listen(new TelListener(context), PhoneStateListener.LISTEN_CALL_STATE); 

TelListener是自己定义的电话状态监听类,继承自PhoneStateListener,监听来电只需要实现onCallStateChanged(int state, String incomingNumber)方法。

咳咳...标题上说了弹出悬浮窗口,其实悬浮窗口就是在WindowManager中添加一个View,这个功能我也是在TelListener实现的。要想实现悬浮窗口,首先得有“android.permission.SYSTEM_ALERT_WINDOW”的权限,在manifest中申明如下:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

WindowManager需要通过context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);

来获取。

 

先把TelListener源码放出来,再详解

    public class TelListener extends PhoneStateListener {  private Context context;  private WindowManager wm;  private TextView tv;  public TelListener(Context context){  this.context = context;  }  @Override  public void onCallStateChanged(int state, String incomingNumber) {  // TODO Auto-generated method stub  super.onCallStateChanged(state, incomingNumber);  if(state == TelephonyManager.CALL_STATE_RINGING){  wm = (WindowManager)context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);    WindowManager.LayoutParams params = new WindowManager.LayoutParams();    params.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;    params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;   params.width = WindowManager.LayoutParams.WRAP_CONTENT;    params.height = WindowManager.LayoutParams.WRAP_CONTENT;    <span style="white-space: pre;">            </span>params.format = PixelFormat.RGBA_8888;  tv = new TextView(context);   tv.setText("这是悬浮窗口,来电号码:" + incomingNumber);  wm.addView(tv, params);  }else if(state == TelephonyManager.CALL_STATE_IDLE){  if(wm != null){  wm.removeView(tv);  }  }  }  }  

state = TelephonyManager.CALL_STATE_RINGING表示有新的来电,state = TelephonyManager.CALL_STATE_IDLE表示电话中断(可能理解不是很准确,电话挂断的时候state会和TelephonyManager.CALL_STATE_IDLE相等)

定义窗口布局

WindowManager.LayoutParams params = new WindowManager.LayoutParams();  

设置窗口类型在所有窗口之上
    params.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;   
别忘了
params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;  

如果没有这句话的话,在生成悬浮窗口后,悬浮窗口后的界面上东西都不能点。这句话的目的是让悬浮窗口失去焦点。
背景透明
params.format = PixelFormat.RGBA_8888;  
本例中悬浮窗口只是显示一个TextView其内容为“这是悬浮窗口,来电号码:xxxxxx”,最后将TextView添加到窗体中
wm.addView(tv, params);  

在电话中断后将TextView移除,否则会一直显示的...
wm.removeView(tv); 

啦..本文就到这儿了... 

“啥?要可移动的?”

要想可以拖动的话,那给TextView添加setOnTouchListener,实现OnTouchListener的onTouchListener方法。

对了,别忘了将

params.type = WindowManager.LayoutParams.TYPE_PHONE;

因为TYPE_SYSTEM_OVERLAY的话是TextView获取不到输入焦点,也就没法拖动了哈。



转自:http://blog.chinaunix.net/space.php?uid=15059847&do=blog&id=3041149





这篇关于[Android] 来电归属地查询的实现思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/298200

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P