ims Registered and Volte enable on Android N

MTK IMS框架简析(2)——IMS注册过程 结合log和代码,分析android上层如何配合进行ims注册 阅读详情

转载请注明出处:http://blog.youkuaiyun.com/aaa111/article/details/73872220

文前

代码基于mkm-mr1 android 7.1.2
本篇记录了调查ims Registered状态和VoLTE enable状态的一些取值和更新的关键方法。
初衷是调查ims  registered 状态和 VoLTE Available 有没有对外提供接口,以及这两者有什么逻辑上的关系。
PS:本文采取“双线叙事”,同时调查ims Registered和Volte enable的关键方法,如果读者感觉有点乱,可以一次只看ims或者volte(这意味着你要看两遍,其实是我懒不想分开写)。

正文

TelephonyManager.java向系统其他应用(Settings,SystemUI)提供接口,为什么说是“ 系统其他应用 ”呢?
因为以下几个方法都是@hide方法,不对第三方应用公开。

fw/base/telephony
TelephonyManager.java
以下两个方法都是获得ims registered的方法,区别在于第二个方法需传入subId作为参数。
   
  1. /**
  2. * Returns the IMS Registration Status
  3. * @hide
  4. */
  5. public boolean isImsRegistered() {
  6. try {
  7. ITelephony telephony = getITelephony();
  8. if (telephony == null)
  9. return false;
  10. return telephony.isImsRegistered();
  11. } catch (RemoteException ex) {
  12. return false;
  13. } catch (NullPointerException ex) {
  14. return false;
  15. }
  16. }

    
  1. /**
  2. * Returns the IMS Registration Status
  3. * using subId
  4. * @hide
  5. */
  6. public boolean isImsRegisteredForSubscriber(int subId) {
  7. try {
  8. ITelephony telephony = getITelephony();
  9. if (telephony == null)
  10. return false;
  11. return telephony.isImsRegisteredForSubscriber(subId);
  12. } catch (RemoteException ex) {
  13. return false;
  14. } catch (NullPointerException ex) {
  15. return false;
  16. }
  17. }

下面这个方法返回的是VoLTE status
   
  1. /**
  2. * Returns the Status of Volte
  3. * @hide
  4. */
  5. public boolean isVolteAvailable() {
  6. try {
  7. return getITelephony().isVolteAvailable();
  8. } catch (RemoteException ex) {
  9. return false;
  10. } catch (NullPointerException ex) {
  11. return false;
  12. }
  13. }
到现在为止我们知道TelephonyManager.java中有三个hide方法返回ims registered和VoLTE Status,但都是hide方法,不对第三方应用公开。

packages/services/Telephony
PhoneInterfacemanager.java
到了这可以看到,两个方法调用的都是Phone.java 里的registered()方法(当然,实际调用的是ImsPhone.java里的同名方法)。
    
  1. @Override
  2. public boolean isImsRegistered() {
  3. return mPhone.registered();
  4. }
  5. /*
  6. * {@hide}
  7. * Returns the IMS Registration Status based on subId
  8. */
  9. public boolean isImsRegisteredForSubscriber(int subId) {
  10. final Phone phone = getPhone(subId);
  11. if (phone != null) {
  12. return phone.isImsRegistered();
  13. }
  14. return false;
  15. }
然后下面这个是VoLTE的, isVolteAvailable和isVolteEnabled居然是等价的,意味着开启即可用?
    
  1. /*
  2. * {@hide}
  3. * Returns the IMS Registration Status
  4. */
  5. public boolean isVolteAvailable() {
  6. return mPhone.isVolteEnabled();
  7. }
然后观察到这个类里面还有个方法来设置ims registration status的,但是吧其实这个方法没有使用到。
    
  1. public void setImsRegistrationState(boolean registered) {
  2. enforceModifyPermission();
  3. mPhone.setImsRegistrationState(registered);
  4. }
Phone.java
这个方法只在GsmCdmaPhone.java里面重写了,但是GsmCdmaPhone会有ims服务?
    
  1. /**
  2. * Set IMS registration state
  3. */
  4. public void setImsRegistrationState(boolean registered) {
  5. }

ImsRegistered的最终取值

fw/opt/telephony
ImsPhone.java
下面便是Ims registered 取值的终点,接下来看的 赋值(更新)的地方。
setImsRegistered()正是给mImsRegistered 赋值的地方
   
  1. @Override
  2. public boolean isImsRegistered() {
  3. return mImsRegistered;
  4. }
  5. public void setImsRegistered(boolean value) {
  6. mImsRegistered = value;
  7. }
而Volte的取值还需再跟进一步
    
  1. @Override
  2. public boolean isVolteEnabled() {
  3. return mCT.isVolteEnabled();
  4. }

VolteEnabled的最终取值

fw/opt/telephony
ImsPhoneCallTracker.java
来自一个布尔值,其实是一个布尔数组里面的其中一个值。
    
  1. public boolean isVolteEnabled() {
  2. return mImsFeatureEnabled[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE];
  3. }

Ims Registered 的更新

巧合的是ims registered的更新也是在这个类里面
   
  1. /**
  2. * Listen to the IMS service state change
  3. *
  4. */
  5. private ImsConnectionStateListener mImsConnectionStateListener =
  6. new ImsConnectionStateListener() {
  7. @Override
  8. public void onImsConnected() {
  9. if (DBG) log("onImsConnected");
  10. mPhone.setServiceState(ServiceState.STATE_IN_SERVICE);
  11. mPhone.setImsRegistered(true);
  12. mMetrics.writeOnImsConnectionState(mPhone.getPhoneId(),
  13. ImsConnectionState.State.CONNECTED, null);
  14. }
  15. @Override
  16. public void onImsDisconnected(ImsReasonInfo imsReasonInfo) {
  17. if (DBG) log("onImsDisconnected imsReasonInfo=" + imsReasonInfo);
  18. mPhone.setServiceState(ServiceState.STATE_OUT_OF_SERVICE);
  19. mPhone.setImsRegistered(false);
  20. mPhone.processDisconnectReason(imsReasonInfo);
  21. mMetrics.writeOnImsConnectionState(mPhone.getPhoneId(),
  22. ImsConnectionState.State.DISCONNECTED, imsReasonInfo);
  23. }
  24. @Override
  25. public void onImsProgressing() {
  26. if (DBG) log("onImsProgressing");
  27. mPhone.setServiceState(ServiceState.STATE_OUT_OF_SERVICE);
  28. mPhone.setImsRegistered(false);
  29. mMetrics.writeOnImsConnectionState(mPhone.getPhoneId(),
  30. ImsConnectionState.State.PROGRESSING, null);
  31. }
  32. ...
  33. }
上面的代码显示,在Ims 连接后设置setImsRegistered 为true,在 断开后和 正在连接的时候都设置为false。

VolteEnable 的更新 

fw/opt/telephony
ImsPhoneCallTracker.java
Volte的更新也来自ImsConnectionStateListener,更新的是我们取值的那个布尔变量。
除此之外还有两个地方用到了ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE, 但是和这里无关。
其一:
还是在ImsConnectionStateListener里面,
    
  1. /**
  2. * Listen to the IMS service state change
  3. *
  4. */
  5. private ImsConnectionStateListener mImsConnectionStateListener =
  6. new ImsConnectionStateListener() {
  7. ...
  8. @Override
  9. public void onFeatureCapabilityChanged(int serviceClass,
  10. int[] enabledFeatures, int[] disabledFeatures) {
  11. if (serviceClass == ImsServiceClass.MMTEL) {
  12. boolean tmpIsVideoCallEnabled = isVideoCallEnabled();
  13. // Check enabledFeatures to determine capabilities. We ignore disabledFeatures.
  14. StringBuilder sb;
  15. if (DBG) {
  16. sb = new StringBuilder(120);
  17. sb.append("onFeatureCapabilityChanged: ");
  18. }
  19. for (int i = ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE;
  20. i <= ImsConfig.FeatureConstants.FEATURE_TYPE_UT_OVER_WIFI &&
  21. i < enabledFeatures.length; i++) {
  22. if (enabledFeatures[i] == i) {
  23. // If the feature is set to its own integer value it is enabled.
  24. if (DBG) {
  25. sb.append(mImsFeatureStrings[i]);
  26. sb.append(":true ");
  27. }
  28. mImsFeatureEnabled[i] = true;
  29. } else if (enabledFeatures[i]
  30. == ImsConfig.FeatureConstants.FEATURE_TYPE_UNKNOWN) {
  31. // FEATURE_TYPE_UNKNOWN indicates that a feature is disabled.
  32. if (DBG) {
  33. sb.append(mImsFeatureStrings[i]);
  34. sb.append(":false ");
  35. }
  36. mImsFeatureEnabled[i] = false;
这个方法重写自:
ImsConnectionStateListener.java
这个是跟IMS连接紧密相关的
      
  1. /**
  2. * Called when its current IMS connection feature capability changes.
  3. */
  4. public void onFeatureCapabilityChanged(int serviceClass,
  5. int[] enabledFeatures, int[] disabledFeatures) {
  6. // no-op
  7. }
上面的方法调用自:
fw/opt/net
ImsManager.java
    
  1. @Override
  2. public void registrationFeatureCapabilityChanged(int serviceClass,
  3. int[] enabledFeatures, int[] disabledFeatures) {
  4. log("registrationFeatureCapabilityChanged :: serviceClass=" +
  5. serviceClass);
  6. if (mListener != null) {
  7. mListener.onFeatureCapabilityChanged(serviceClass,
  8. enabledFeatures, disabledFeatures);
  9. }
  10. }

后面两种是在ImsManager.java 这个类中的更新,更新的值保存在新建的ImsConfig对象中,值得注意的是,并没有哪块代码去getFeatureValue。如读者不关心这部分可以直接跳到文末总结部分。
其二:
fw/opt/net
ImsManager.java 
可以看到首先创建了一个ImsConfig对象,然后通过setFeatureValue()方法对ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE进行更新。
    
  1. private void setLteFeatureValues(boolean turnOn) {
  2. log("setLteFeatureValues: " + turnOn);
  3. try {
  4. ImsConfig config = getConfigInterface();
  5. if (config != null) {
  6. config.setFeatureValue(ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE,
  7. TelephonyManager.NETWORK_TYPE_LTE, turnOn ? 1 : 0, mImsConfigListener);
  8. if (isVtEnabledByPlatform(mContext)) {
  9. boolean ignoreDataEnabledChanged = getBooleanCarrierConfig(mContext,
  10. CarrierConfigManager.KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS);
  11. boolean enableViLte = turnOn && isVtEnabledByUser(mContext) &&
  12. (ignoreDataEnabledChanged || isDataEnabled());
  13. config.setFeatureValue(ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE,
  14. TelephonyManager.NETWORK_TYPE_LTE,
  15. enableViLte ? 1 : 0,
  16. mImsConfigListener);
  17. }
  18. }
  19. } catch (ImsException e) {
  20. loge("setLteFeatureValues: exception ", e);
  21. }
  22. }
查看方法调用得知,是用户在界面上开启enhanced_4g_lte这个开关才更新的,我们推断这次更新只和用户设置有关系,和网络没有关系,但这似乎是不合理的。
除了更新ImsConfig还更新了Settings 数据库中的存储。
图 略
 
其三:
    
  1. /**
  2. * Update VoLTE config
  3. * @return whether feature is On
  4. * @throws ImsException
  5. */
  6. private boolean updateVolteFeatureValue() throws ImsException {
  7. boolean available = isVolteEnabledByPlatform(mContext);//平台支持
  8. boolean enabled = isEnhanced4gLteModeSettingEnabledByUser(mContext);//开关打开
  9. boolean isNonTty = isNonTtyOrTtyOnVolteEnabled(mContext);
  10. boolean isFeatureOn = available && enabled && isNonTty;
  11. log("updateVolteFeatureValue: available = " + available
  12. + ", enabled = " + enabled
  13. + ", nonTTY = " + isNonTty);
  14. getConfigInterface().setFeatureValue(
  15. ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE,
  16. TelephonyManager.NETWORK_TYPE_LTE,
  17. isFeatureOn ?
  18. ImsConfig.FeatureValueConstants.ON :
  19. ImsConfig.FeatureValueConstants.OFF,
  20. mImsConfigListener);
  21. return isFeatureOn;
  22. }
查看方法调用我们推断,这次更新依赖于Ims网络服务。但是这个更新条件的Action是Action to broadcast when ImsService is up。这样看来这里似乎只有在IMS服务建立的时候才会执行。
图 略
其中Intent action
    
  1. /**
  2. * Action to broadcast when ImsService is up.
  3. * Internal use only.
  4. * @hide
  5. */
  6. public static final String ACTION_IMS_SERVICE_UP =
  7. "com.android.ims.IMS_SERVICE_UP";

整理流程:

 

总结

ImsRegistered的取值来自ImsPhone.java的mImsRegistered,这个值 取决于ims网络连接状态。在Telephony中的接口为hide方法,对第三方不可见。
VolteAvailable的取值来自ImsPhoneCallTracker.java的 ImsConnectionStateListener, ImsConnectionStateListener监听onFeatureCapabilityChanged来更新(布尔值)。 在Telephony中的接口为hide方法,同样对第三方不可见。
以上两者更新的关键方法都在ImsPhoneCallTracker.java的 ImsConnectionStateListener里。
因果表示学习 (Causal Representation Learning, CRL) 传统的机器学习,尤其是深度学习,非常擅长学习数据中的相关性 (Correlation)。但它常常会走“捷径”,学到一些虚假的、不稳定的“表面联系”。一个AI模型在学习识别“牛”时,如果训练数据里所有的牛都在绿色的草地上,模型很可能会学到一个错误的规则:“牛 = 四条腿的生物 + 绿色背景”。你给它一张牛在海滩上的照片,它就可能不认识了。因果表示学习的目标,就是让模型超越这种表面相关性,去学习数据背后。 阅读详情

相关推荐

Camera mipi通信协议

MIPI(移动行业处理器接口),是的缩写。MIPI移动行业处理器接口)是MIPI联盟发起的为移动应用处理器制定的开放标准。分别定义了一系列的手机内部接口标准,比如摄像头接口CSI、显示接口DSI,其中是由MIPI联盟下Camera工作组指定的接口标准。CSI-2是MIPI CSI第二版,主要由应用层、协议层、物理层组成,最大支持4通道数据传输、单线传输速度高达1Gb/s。

arvin_xiong的博客 3731

Android VoLTE 视频通话是否可用状态读取与监听

展讯volte视频通话 初始化状态读取TelephonyManager.isImsRegistered() 在远程服务端中对应的接口实际上为: frameworks\opt\telephony\src\java\com\android\internal\telephony\PhoneBase.java /** * Get IMS Registration Status */

编程之路的专栏 1万+

ESP32S3编译micropython固件

编译ESP32芯片的micropython固件

m0_73253860的博客 2554

Android 7.0 IMS框架详解

本文主要讲解IP Multimedia Subsystem (IMS)在Android 7.0上由谷歌Android实现的部分内容。 从APP侧一直到Telephony Framework,是不区分CS流程还是PS流程的。到了Telephony Framework模块,会依据IMS相关的状态信息(Registration Status,Service Status等)和用户设置信息(Volte E

linyongan 2万+

CANoe/CANalyzer新手必看:从零配置到报文分析的完整流程(附B站官方教程实操)

本文为CANoe/CANalyzer新手提供从零配置到报文分析的完整流程指南,涵盖硬件连接、工程配置、报文捕获及信号级分析等关键步骤。通过详细的实操案例和B站官方教程,帮助工程师快速掌握汽车电子总线分析工具的核心应用,提升诊断效率与通信系统理解。

y7z8a的博客 775

Ubuntu24安装MongoDB(解压版)

依据前面 Linux 发行版本的信息,选择你需要的版本,文件格式选择 tgz 格式,最后点击 Download(下载到你的电脑)或 点击 Copy link 左侧图标(复制下载链接在使用服务器下载)依据前面 Linux 发行版本的信息,选择你需要的版本,文件格式选择 tgz 格式,最后点击 Download(下载到你的电脑)或 点击 Copy link 左侧图标(复制下载链接在使用服务器下载)默认情况下,只能在本机访问 MongoDB,要想远程访问 MongoDB,需要修改配置文件。

rao991207823的博客 2022

NETWORK_TYPE总结

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33946020的博客 1707

告别ROS1思维:在ROS2 Humble上,用Python搞定MoveIt2机械臂控制的完整流程

本文详细介绍了在ROS2 Humble环境下使用Python控制MoveIt2机械臂的完整流程。从环境配置、架构变革到实战操作,涵盖URDF适配、Action接口编程及性能优化技巧,帮助开发者高效迁移ROS1项目至ROS2平台,实现工业级机械臂控制。

weixin_30352645的博客 451

Android VoLte 开关状态

什么是VoLTE?文笔不好,看官多担待.度娘介绍的很清楚了,不多说了,只是在5.1Lollipop开始系统就应经有关于VoLte的开关了,中文叫:增强型4G LTE模式.How to enable HD Voice Calling on Android 5.1 LollipopGoogle has recently rolled out the highly-anticipated Android

桉树先生 1万+

把 SAP 配置当成一张地图:用 IMG 把实施、变更与治理串成一条清晰的路

摘要 SAP IMG(Implementation Guide)是SAP实施的核心导航体系,它将客户需求转化为系统配置,提供结构化路径和文档化支持。IMG不是简单的菜单树,而是包含业务落地路径、标准化配置活动和文档化知识的实施语言。通过三种视图(Reference、Enterprise、Project)解决不同管理问题,其中Project IMG尤其重要,可管理项目范围、分工和进度。实际工作中应通过SPRO事务码访问IMG,将探索与执行分开管理。案例显示,跨国企业通过Project IMG可有效控制组织架构

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 230

基于STC8G1K08A单片机的PCA捕获外部信号(100~1000HZ)程序实现

基于STC8G1K08A单片机的PCA捕获外部信号(100~1000HZ)程序实现

weixin_74013772的博客 256

TelephonyManager中的网络类型列表

状态 值 类型 NETWORK_TYPE_UNKNOWN 0 不知名的网络 NETWORK_TYPE_GPRS 1 2G(2.5) NETWORK_TYPE_EDGE 2 2G(2.75G) NETWORK_TYPE_UMTS 3 3G WCDMA 联通 NETWORK_TYPE_CDMA 4 2G 电信 NETWORK_TYPE_EVDO_0 5 3G N...

m0_37063730的博客 1304

使用 Simulink + Simscape Electrical 对锂电池储能系统的充放电管理策略进行建模与仿真

摘要:本文详细介绍了基于Simulink的锂电池储能系统充放电管理策略建模与仿真方法。重点阐述了系统结构设计、建模过程(包括锂电池模型、充放电控制器、热管理系统等模块搭建)以及仿真设置。通过分析荷电状态管理、温度控制和功率限制等核心要素,展示了如何实现安全高效的充放电策略。仿真结果可验证系统性能,为优化管理策略提供依据。该方法为新能源存储和智能电网应用提供了实用的仿真分析工具。

amy_mhd的博客 159

获取手机网络类型和IP地址

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 使用NetworkInfo的getType()方法可以判断是WiFi还是手机网络。手机网络的情况下,使用NetworkInfo的getSubtype()方法去和TelephonyManager的网络类型常量值去比较...

孤云博客 6953

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Android IMS 通话应用设计

背景 以下内容基于Android P code。 应用框架设计 Android电话模块是一个典型的分层结构设计,如下: 分层结构 IMS在CS通话的基础上增加了telephony/ims net/ims vendor/ims 和ims相关的media模块。 其中: telephony/ims:主要包括了对外接口ImsPhone,通话管理中心ImsPhoneCallTracker,...

好记性不如写博客! 3209

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IMS基本概念之 注册和呼叫发起

3. IMS中的一些概念3.1 概述本章以IP多媒体子系统(IMS)的注册和会话建立的初步介绍开始,并且描述了涉及到的IMS实体。目的不是去做全方位的解释,而是给读者以总体的认识,并有助于读者理解本章中解释将要介绍的各个IMS概念。详细的注册和会话建立流程将会在书的后面部分进行展示和解释。在进行IMS注册之前,用户设备(UE)必须寻找它发送REGISTER消息的目的IMS实体。这个概念

foolskindom的专栏 2万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

判断手机移动网络5G识别方法

刚好今天用到,就放着给大家一起用下,实在是这时候网上不好找,也是去developer上面找文档的 public static int getCurrentNetType(Context context) { int type = 1;//默认wifi ConnectivityManager cm = (ConnectivityManager) context.get...

北极的松树的博客 6441

Android SIM卡 插拔监听

记录一下 import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.telephony.TelephonyManager; /** * 监听sim状态改变的广...

103style 4863

Android手机网络NetWorkType对应的常量值

本篇是为了方便以后使用,无需再百度 这是对应的参数类型/** * GPRS 2G(2.5) General Packet Radia Service 114kbps * EDGE 2G(2.75G) Enhanced Data Rate for GSM Evolution 384kbps * UMTS 3G WCDMA 联通3G Universal

细心程度决定你的成败 1万+

Android 判断用户2G/3G/4G移动数据网络

Android 判断用户2G/3G/4G移动数据网络 在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以在 App 的设置模块里,让用户自己选择,在 2G / 3G / 4G 网络条件下,是否允许请求一些流量比较大的数据。 通过 Android 提供的 TelephonyManage

Hknock的专栏 3万+

Android8.1 开关VOLTE流程分析

前言 最近有需求需要实现插卡默认打开Volte功能,顺带研究了下Volte的流程,在此做个记录 开始 从Settings设置界面入手,网络和互联网-->移动网络-->VoLTE高清通话(电信卡)/增强型4G LTE模式(移动卡) 找到网络和互联网加载对应的Fragment为NetworkDashboardFragment, 源码位置 vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settin...

ElegantHedgehog的博客 2741

获取网络类型

相关类型列表:1、NETWORK_TYPE_1xRTT: 常量值:7 网络类型:1xRTT 2、NETWORK_TYPE_CDMA : 常量值:4 网络类型: CDMA (电信2g) 3、NETWORK_TYPE_EDGE: 常量值:2 网络类型:EDGE(移动2g) 4、NETWORK_TYPE_EHRPD: 常量值:14 网络类型:eHRPD 5、NETWORK_TYPE_EVDO_0

ABang的博客 954

windows time 服务无法启动解决方法:w32tm /register

一、Windows time服务用于和Internet同步系统时间,如果时间无法同步有可能是服务没有随系统启动,可以在运行处输入"services.msc"打开服务控制台,找到"windows time"服务设置为自动并启动即可。 如果启动该服务时提示: 错误1058:无法启动服务,原因可能是已被禁用与其相关联的设备没有启动。 原因是windows time服...

weixin_33800593的博客 1万+

TM卡简介

   TM (Touch Memory) 卡是美国DALLAS公司的专利产品,它采用单线协议通讯,通过瞬间碰触完成数据读写,既具有非接触式IC卡的易操作性,又具有接触式IC卡的廉价性,是当前性价比最优秀的IC卡之一。  1、TM卡的基本原理  TM卡外形类似于一个钮扣(Button)电池,可镶嵌于卡片、钥匙扣等物体上。TM卡通过一个多功能器来实现将数据线、地址线、控制线和电

挨踢小诸葛 ---一为振兴中国软件产业尽一份微薄之力 3171

Android Call分析(一) ---- Call对象详解

Call(通话)相关的内容也是属于Telephony模块,Call整体上可以分成两类: 1. CS call,其中CS全称是Circuit Switch,我们平常打电话走的就是CS的流程。 2. IMS PS call,其中PS全称是Packet Switch,走IMS流程的Call有4类,分别是VoLTE(voice over LTE),ViLTE(video over LTE),VoWiFi

linyongan 1万+

Android视频通话应用设计

背景 以下内容基于Android N code。 本文会从应用框架、进程交互、流程几个方面,讲解Android手机中视频通话的应用层设计。 应用框架设计 Android电话模块是一个典型的分层结构设计,视频电话在语音通话结构的基础上增加了一些类,但仍遵循原本的分层结构,如下: 分层结构 可以看到,相较于语音通话,视频通话主要增加了以下内容: 在Application层的Telec...

好记性不如写博客! 1632
上一篇: Android Studio自用配置
下一篇: DrawingView android上的一个自定义涂鸦控件
十橙
博客等级 码龄24年 312粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值