intel手机信号的强度变化追溯

2024-09-04 01:32

本文主要是介绍intel手机信号的强度变化追溯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最开始

public int getGsmLevel() {int level;// ASU ranges from 0 to 31 - TS 27.007 Sec 8.5// asu = 0 (-113dB or less) is very weak// signal, its better to show 0 bars to the user in such cases.// asu = 99 is a special case, where the signal strength is unknown.int asu = getGsmSignalStrength();if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT;else if (asu >= 8)  level = SIGNAL_STRENGTH_GOOD;else if (asu >= 5)  level = SIGNAL_STRENGTH_MODERATE;else level = SIGNAL_STRENGTH_POOR;if (DBG) log("getGsmLevel=" + level);log("getGsmLevel=" + level);	return level;}

然后转到

 public int getLevel() {int level;if (isGsm) {level = getLteLevel();if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {log("matt2" + level);	level = getGsmLevel();}} else {int cdmaLevel = getCdmaLevel();int evdoLevel = getEvdoLevel();if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {/* We don't know evdo, use cdma */level = cdmaLevel;} else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {/* We don't know cdma, use evdo */level = evdoLevel;} else {/* We know both, use the lowest level */level = cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel;}}if (DBG) log("getLevel=" + level);return level;}

然后转到

 public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) {// Bin the strength.int bin = signalStrength.getLevel();Log.i("matts-notePhoneSignalStrengthLocked", "Phone Data Connection -> " );updateAllPhoneStateLocked(mPhoneServiceStateRaw, mPhoneSimStateRaw, bin);}



然后转到

public void notePhoneSignalStrength(SignalStrength signalStrength) {enforceCallingPermission();synchronized (mStats) {Slog.i("matts-notePhoneSignalStrength", "SENDING BATTERY INFO:");mStats.notePhoneSignalStrengthLocked(signalStrength);}}

然后转到

private void broadcastSignalStrengthChanged(SignalStrength signalStrength) {long ident = Binder.clearCallingIdentity();try {mBatteryStats.notePhoneSignalStrength(signalStrength);} catch (RemoteException e) {/* The remote entity disappeared, we can safely ignore the exception. */} finally {Binder.restoreCallingIdentity(ident);}Intent intent = new Intent(TelephonyIntents2.ACTION_SIGNAL_STRENGTH_CHANGED);intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);Bundle data = new Bundle();signalStrength.fillInNotifierBundle(data);intent.putExtras(data);mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);}


然后转到

 public void notifySignalStrength(SignalStrength signalStrength) {if (!checkNotifyPermission("notifySignalStrength()")) {return;}synchronized (mRecords) {mSignalStrength = signalStrength;for (Record r : mRecords) {if ((r.events & PhoneStateListener.LISTEN_SIGNAL_STRENGTHS) != 0) {try {r.callback.onSignalStrengthsChanged(new SignalStrength(signalStrength));} catch (RemoteException ex) {mRemoveList.add(r.binder);}}if ((r.events & PhoneStateListener.LISTEN_SIGNAL_STRENGTH) != 0) {try {int gsmSignalStrength = signalStrength.getGsmSignalStrength();r.callback.onSignalStrengthChanged((gsmSignalStrength == 99 ? -1: gsmSignalStrength));} catch (RemoteException ex) {mRemoveList.add(r.binder);}}}handleRemoveListLocked();}broadcastSignalStrengthChanged(signalStrength);}



然后转到

public void notifySignalStrength() {mNotifier.notifySignalStrength(this);}


然后转到

 public void notifySignalStrength(Phone sender) {try {if (isPrimaryPhone(sender)) {mRegistry.notifySignalStrength(sender.getSignalStrength());} else {mRegistry2.notifySignalStrength(sender.getSignalStrength());}} catch (RemoteException ex) {// system process is dead}}

这个函数所在的class中有个

 DefaultPhoneNotifier() {mRegistry = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService("telephony.registry"));}
TelephonyRegistry是ITelephonyRegistry.Stub的子类,作为service运行在system_server进程中,它会通知注册者。上面的DefaultPhoneNotifier运行在com.android.phone进程中,当信号强度值变化时,通过Service进行通知(service被感兴趣的注册者调用了listen,添加了回调函数。


在TelephonyManager.java中提供了API,应用程序可以监听各种事件,实际上它将感兴趣的监听者作为一条记录添加到service一侧的列表(跨进程)中,当有变化时,调用它们提供的回调函数,通知(跨进程)这些注册者。
TelephonyManager.java中的listen函数如下:

 public void listen(PhoneStateListener listener, int events) {if (isDefaultManager() == false) {if (sRegistry2 == null) {sRegistry2 = ITelephonyRegistry2.Stub.asInterface(ServiceManager.getService("telephony.registry2"));}}String pkgForDebug = mContext != null ? mContext.getPackageName() : "<unknown>";try {Boolean notifyNow = true;if (isDefaultManager()) {sRegistry.listen(pkgForDebug, listener.callback, events, notifyNow);} else {sRegistry2.listen(pkgForDebug, listener.callback, events, notifyNow);}} catch (RemoteException ex) {// system process dead} catch (NullPointerException ex) {// system process dead}}

下面的代码就是调用的listen函数,收到event之后的回调处理函数是mPhoneStateListener


public NetworkController(Context context) {mContext = context;final Resources res = context.getResources();ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);mHasMobileDataFeature = cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE);mShowPhoneRSSIForData = res.getBoolean(R.bool.config_showPhoneRSSIForData);mShowAtLeastThreeGees = res.getBoolean(R.bool.config_showMin3G);mAlwaysShowCdmaRssi = res.getBoolean(com.android.internal.R.bool.config_alwaysUseCdmaRssi);// set up the default wifi icon, used when no radios have ever appearedupdateWifiIcons();updateWimaxIcons();// telephonymPhone = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);mPhone.listen(mPhoneStateListener,PhoneStateListener.LISTEN_SERVICE_STATE| PhoneStateListener.LISTEN_SIGNAL_STRENGTHS| PhoneStateListener.LISTEN_CALL_STATE| PhoneStateListener.LISTEN_DATA_CONNECTION_STATE| PhoneStateListener.LISTEN_DATA_ACTIVITY);


下面就是回调函数的实现


<span style="font-size:18px;">PhoneStateListener mPhoneStateListener = new PhoneStateListener() {@Overridepublic void onSignalStrengthsChanged(SignalStrength signalStrength) {if (DEBUG) {Slog.d(TAG, "onSignalStrengthsChanged signalStrength=" + signalStrength +((signalStrength == null) ? "" : (" level=" + signalStrength.getLevel())));}mSignalStrength = signalStrength;updateTelephonySignalStrength();refreshViews();}</span>


在updateSignalStrength函数中,将根据得到的信息,设置适当的图标id,显示合适的图标。



如果上层app想要获取信号强度信息

 case EVENT_POLL_SIGNAL_STRENGTH:// Just poll signal strength...not part of pollState()if (mIsScreenOn) {mCi.getSignalStrength(obtainMessage(EVENT_GET_SIGNAL_STRENGTH));}break;

getSignalStrength (Message result) {RILRequest rr= RILRequest.obtain(RIL_REQUEST_SIGNAL_STRENGTH, result, mIs2ndRil);if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));send(rr);}


在ril.java中这边先创建了一个request然后用send函数发送给ril.c

<span style="font-size:18px;"> case RIL_UNSOL_SIGNAL_STRENGTH: ret = responseSignalStrength(p); break;</span>
查找
<span style="font-size:18px;">private ObjectresponseSignalStrength(Parcel p) {// Assume this is gsm, but doesn't matter as ServiceStateTracker// sets the proper value.SignalStrength signalStrength = SignalStrength.makeSignalStrengthFromRilParcel(p);return signalStrength;}</span>



这篇关于intel手机信号的强度变化追溯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

c++的静态变化!

静态成员   对于非静态成员,一个类的每个对象都自己存有一个副本,每个对象根据自己拥有的非静态的数据成员来区别于其他对象。而静态成员则解决了同一个类的多个对象之间数据和函数的共享问题。   静态数据成员   静态数据成员的作用是:实现同一类的不同对象之间的数据共享。   #include<IOSTREAM>   using namespace std;   class Po

2409atl,atl3.0到7.0的变化

原文 本文不介绍新的ATL7服务器类和属性.这不是一个完整的列表,只是我目前找到的. 串 串转换宏有一些限制.它从栈中分配内存,可能会在大串时溢出栈.函数退出时,释放该串,而不是在函数内引入的域内释放. 它使用过时OLE2ANSI定义.如果你查看MSDN上对_alloca(来转换)的注意,它说它在SEH或C++EH中使用时有限制. 如,看一下ATL3的串转换宏: USES_CONVER

包拯断案 | 数据库从库GTID在变化 为何没有数据写入@还故障一个真相

提问:作为DBA运维的你是否遇到过这些烦恼 1、数据库从库复制链路如何正确配置表过滤信息? 2、数据库从库的GTID在变化,实际却没有数据写入,究竟是什么原因? 心中有章,遇事不慌 作为DBA的你,遇到问题无从下手,除了在问题面前徘徊,还能如何选择?如果你一次或多次遇到该问题还是 无法解决,又很懊恼,该如何排忧呢?关注公众号,关注《包拯断案》专栏,让小编为你排忧解难~ #包拯秘籍#

2020年SEO行业发展变化和趋势分析!

一、搜索引擎算法发展轨迹 第一阶段:人工目录(1997年-2001年“雅虎早期搜索模式”); 第二阶段:文本分析(2001年-2004年“以关键词和背景颜色一样,堆积大量关键词,就会有非常好的排名; 第三阶段:链接分析(2004年-2009年“以反向链接为核心算法的阶段”),这时行业内有句话是内容为王,外链为皇; 第四阶段:智能分析(2009年-现在“以满足用户人性化需求的用户浏览行为分析

保姆级教学:OC监听网络状态变化 Reachability监听网络变化 ios网络变化

本文主要讲解了,在oc开发中,怎么去使用代码进行网络监听,十分的通俗易懂。 首先,在xcode工程中导入SystemConfiguration框架。 然后导入Reachability.h文件。 Reachability文件 点击下载,也可以按照如下内容创建对应的文件。 Reachability.m //文件名Reachability.m/*Copyright (C) 2016 App

Vue2升级Vue3 --- 第三方库变化(基于gogocode)

本次升级基于gogocode快捷转换gogocode升级体验,汇总的部分问题可能与gogocode有关,但仍可作为vue2升级vue3过程中报错问题的解决参考 第三方库变化 1.vue-contextmenujs(右键菜单) // 原第三方库不支持vue3,更换为支持vue3的库"@imengyu/vue3-context-menu": "^1.0.8"// 更换库后组件样式与以前不

Wycheproof:一款针对加密代码库的安全强度测试工具

关于Wycheproof Wycheproof是一款功能强大的加密代码库安全强度检测工具,广大研究人员可以使用Wycheproof来测试加密库的安全健壮度。 工具背景 在密码学中,微小的错误往往会带来灾难性的后果。我们发现,许多加密库频繁陷入这些实施陷阱,且问题常常持续很长时间。然而,获得可靠的实施指南非常困难,因为安全地实现密码学需要深入理解几十年的学术研究。我们意识到,软件

有temp表包含A,B两列,使用SQL,对B列进行处理,形成C列,按A列顺序,B列值不变,则C列累计技术,B列值变化,则C列重新开始计数

有temp表,使用SQL,对B列进行处理,形成C列,按A列顺序,B列值不变,则C列累计技术,B列值变化,则C列重新开始计数 建表语句如下 CREATE TABLE temp(A STRING ,B STRING );INSERT INTO TABLE temp VALUES('2010','1'),('2011','1'),('2012','1'),('2013','0'),('2014',

用异步序列优雅的监听 SwiftData 2.0 中历史追踪记录(History Trace)的变化

概述 WWDC 24 一声炮响为我们送来 Swift 6.0 的同时,也颇为“低调”的推出了 SwiftData 2.0。在新版本的 SwiftData 中,苹果为其新增了多个激动人心的新特性,其中就包括历史记录追踪(History Trace)。 不过,历史记录追踪目前看起来似乎有些“白璧微瑕”,略微让人有些不爽。在这里就让我们看看如何利用 Swift 结构化并发中的异步序列(Asy