Android系統編程入門系列之硬體交互——通信硬體電信SIM卡

来源:https://www.cnblogs.com/BobGo/archive/2022/03/20/15982653.html
-Advertisement-
Play Games

現在的SIM卡通常具備基站定位、語音通話、簡訊消息、網路流量這四大功能,而在移動端是無法對SIM卡使用基站定位功能的,所以這裡只介紹移動端如何使用SIM卡實現語音通話、簡訊消息、數據流量三個功能。 ##語音通話 Android系統中提供了通話服務,同時自帶系統級應用可以通過該通話服務使用SIM卡的通 ...


现在的SIM卡通常具备基站定位、语音通话、短信消息、网络流量这四大功能,而在移动端是无法对SIM卡使用基站定位功能的,所以这里只介绍移动端如何使用SIM卡实现语音通话、短信消息、数据流量三个功能。

语音通话

Android系统中提供了通话服务,同时自带系统级应用可以通过该通话服务使用SIM卡的通话功能。因此在第三方应用中使用语音通话功能,有两种思路。其一是通过应用间唤起,由第三方应用传入指定的Intent意图对象调起系统电话应用,之后在系统电话应用操作完成后返回第三方应用;其二是在第三方应用中直接调用通话服务相关接口,通话服务可实现自定义通话界面、语音通话和保存历史通话信息等功能。

应用间唤起方式

唤起系统的电话应用,有两种等价方式,其一是将指定的意图对象传入startActivtiy(Intent intent)中,其二是通过android.telecom.TelecomManager电话管理类的相关方法调用,获取TelecomManager对象的方式是通常调用Context对象的getSystemService(String name)方法,传入参数 name 值为Context.TELECOM_SERVICE="telecom"得到的返回值。方式一是对方式二的代码封装。

权限声明

需要在清单文件中声明拨打电话权限,其值为Manifest.permission.CALL_PHONE="android.permission.CALL_PHONE"。该权限为 dangerous 级权限,因此在Android6.0即API 23及之后的版本中,还需要在唤起系统电话应用之前动态申请该权限。

唤起流程

在调用startActivity(Intent intent)方法时,传入的参数 intent 必须设置其 action 行为值为Intent.ACTION_CALL。如果需要输入电话号码,可以设置其 data 数据值为Uri.parse(String str)的生成结果,其中参数 str 便是以"tel:"起始加电话号的字符串结构。另外还可以对 intent 设置额外数据,其键值在TelecomManager中均以常量形式定义。

如果使用TelecomManager通话管理类对象,则是调用该对象的placeCall(Uri address, Bundle extras),该方法中的参数 address 即使用第三方应用唤醒系统通话时传入意图中的数据参数 data 值;而参数 extras 同样是第三方应用唤醒系统通话时传入意图中的额外数据。

自定义界面实现通话服务

主要是自定义Service服务实现android.telecom.ConnectionService语音通话连接服务类。

使用通话服务,首先要在清单文件中声明通话的四大权限,包括管理通话权限Manifest.permission.MANAGE_OWN_CALLS="android.permission.MANAGE_OWN_CALLS",读取通话记录权限Manifest.permission.READ_CALL_LOG="android.permission.READ_CALL_LOG",读取通话状态权限Manifest.permission.READ_PHONE_STATE="android.permission.READ_PHONE_STATE",读取电话号码权限Manifest.permissions.READ_PHONE_NUMBERS="android.permissions.READ_PHONE_NUMBERS"

还要在清单文件中注册自定义的Service服务,在<service></service>标签中声明该服务所使用的权限为Manifest.permission.BIND_TELECOM_CONNECTION_SERVICE="android.permission.BIND_TELECOM_CONNECTION_SERVICE"绑定通话连接服务权限,同时设置其意图过滤标签<intent-filter></intent-filter>中的行为标签<action>值必须为"android.telecom.ConnectionService",该意图行为与系统通话服务一致,因此在该应用中收到该意图后,系统将会调用该应用中的自定义通话连接服务。

之后就是自定义的ConnectionService通话连接服务中的代码了,在该类中主要重写两个方法,包括去电时的回调方法onCreateOutgoingConnection(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request),盒来电时的回调方法onCreateIncomingConnection(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request)。这两个方法都会在最后返回android.telecom.Connection通话连接类的对象。

在自定义的Connection通话连接类中,可以重写在通话过程中的不同状态发生变化时的相关回调方法,包括接听来电方法onAnswer(),拒接来电方法onReject(),保持通话方法onHold(),恢复通话方法onUnhold(),挂断通话方法onDisconnect()等。

短信消息

Android系统中同样提供了短信服务,也带有一款系统级应用可以使用SIM卡的短信消息功能。因此在第三方应用中使用短信功能,同样有两种思路。与上文的语音通话功能实现类似,其一是通过应用间唤起的方式,调起系统短信应用.其二是在第三方应用中直接调用短信广播接收器,短信广播接收器可实现及时接收短信内容相关功能。

应用间唤起方式

唤起系统的短信应用,有两种等价方式,其一是将指定的意图对象传入startActivtiy(Intent intent)中,其二是通过android.telephony.SmsManager短信管理类,直接调用相关短信接口。获取SmsManager对象的方式,在Android12即API 31级别以前是通过调用单例模式的静态方法SmsManager.getDefault()直接获取,而从Android12开始改用Context对象的getSystemService(Class<T> serviceClass)传入参数 serviceClass 值为SmsManager.class返回得到的对象。这里的方式一同样也是对方式二的代码封装。

权限声明

需要在清单文件中声明发送短信权限,其值为Manifest.permission.SEND_SMS="android.permission.SEND_SMS"。该权限为 dangerous 级权限,因此在Android6.0即API 23及之后的版本中,还需要在唤起系统短信应用之前动态申请该权限。

唤起流程

在调用startActivity(Intent intent)方法时,传入的参数 intent 必须设置其 action 行为值为Intent.ACTION_SENDTO。如果需要输入接收方的电话号码,可以设置其 data 数据值为Uri.parse(String str)的生成结果,其中参数 str 便是以"smsto:"起始加电话号的字符串结构。另外还可以对 intent 设置额外数据,其键值在SmsManager中均以常量形式定义。

如果使用SmsManager短信管理类对象,则是调用该对象的sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)及其他相关方法发送消息,在该方法中,参数 destinationAddress 即接收方的地址,参数 scAddress 是使用的服务器中心地址,通常为值为null表示使用默认的电信中心服务器,参数 text 为发送的消息体内容,通常一条短信长度为70字节,参数 sentIntent 非空时,将会在短信发送之后回调注册该意图的组件,参数 deliveryIntent 非空时,将会在短信发送给接收方之后回调注册该意图的组件。

自定义界面实现短信服务

主要是自定义BroadcastReceiver广播接收器,实现短信接收实时监听功能。

首先要在清单文件中声明短信接收权限Manifest.permission.RECEIVE_SMS="android.permission.RECEIVE_SMS"

还要在清单文件中注册自定义的BroadcastReceiver广播接收器,在<receiver></receiver>标签内部,设置其意图过滤标签<intent-filter></intent-filter>中的行为标签<action>值必须为"android.provider.Telephony.SMS_RECEIVED",该意图行为与系统短信一致,因此在该应用中收到该意图后,系统发送的广播将会由该应用中的广播接收器接收到。

最后在自定义的BroadcastReceiver中,实现onReceiver(Context context, Intent intent)方法,在该方法中处理接收到广播之后的操作。接收到的短信数据以Protocol Description Unit数据额外数据形式保存在参数 intent 中,可以调用android.provider.Telephony.Sms.Intents.getMessagesFromIntent(Intent intent)静态方法,得到android.telephony.SmsMessage短消息类型。在SmsMessage中便可查看收到的消息内容等信息。

数据流量

数据流量作为联网方式之一,与WLAN联网一起,都可以在android.net.ConnectivityManager连接管理类中操作管理。而由于ConnectivityManager只能管理监听系统的网络状态信息,因此只在连接管理类中判断联网方式时有所涉及,故数据流量的相关功能操作不再单独过多介绍。

———————————————————————————————转载请注明出处:白少木丿—————————————————
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、介紹 Redis誕生於2009年全稱是Remote Dictionary Server,遠程詞典伺服器,是一個基於記憶體 的鍵值型NoSQL資料庫。 特征: ●鍵值(key-value)型, value支持 多種不同數據結構,功能豐富 ●單線程, 每個命令具備原子性 ●低延遲,速度快(基於記憶體、1 ...
  • 前言 21世紀,安卓虛擬機正在一步步的走入我們的生活,小到個人部分朋友在電腦上使用安卓虛擬機玩手游,大到安卓從業人員在虛擬機上面跑程式。不得不承認,對於每一位Androider 而言,安卓虛擬機是我們日常開發中不可或缺的一環,但是關於安卓虛擬機的一些知識點和小細節你真的完全掌握了麽?本文將就主要包括 ...
  • 想獲取一首歌的伴奏卻找不到資源怎麼辦?沒關係,我們可以自己解決。音頻編輯服務提供音源分離的功能,幫助開發者在應用中構建人聲與伴奏分離的功能。 目前,音源分離功能已經開放了人聲與伴奏、樂器等多種分離的方式,可以實時解析並將樂器中的人聲和各種樂器元素提取到獨立的音軌上,滿足創作者對伴奏製作、扒帶、音樂創 ...
  • 一、安裝flutter環境 1、下載Flutter sdk包,地址:https://flutter.dev/docs/get-started/install/windows 2、將壓縮包解壓到任意文件夾 3、將flutter命令文件添加到環境變數中 4、在Android Studio中下載Flutt ...
  • Android跨進程要掌握的是Binder, 而同一進程中最重要的應該就是Handler 消息通信機制了。我這麼說,大家不知道是否認同,如果認同,還希望能給一個關註哈。 什麼是Handler? Handler主要用於非同步消息的處理:當發出一個消息之後,首先進入一個消息隊列,發送消息的[函數]即刻返回 ...
  • Google Analytics: Universal Analytics增強型電子商務,可以讓運營人員輕鬆地跟蹤用戶在其購物歷程中與產品的互動,包括產品展示、產品點擊、查看產品詳情、將產品添加到購物車、結賬流程、交易以及退款等操作。 目前,Google Analytics: Uniersal An ...
  • 如果我們需要設置一個view在另一個view的右邊緣距離一定距離的地方,利用Masonry這麼寫: offset可以讓我們在設置視圖之間相對位置時起到很大作用,但是也有很多情況下用不到,比如size、center等等,而調查Maronry的底層方法,可以看到和offset類似的方法還有很多: off ...
  • RGB、YUV、HSV和HSL區別和關聯 近期在做的一個需求和顏色轉換有關係,所以本篇將開發過程中比較常見的 四種顏色 進行一番梳理。 一、RGB顏色空間 從我們最常見的RGB顏色出發,RGB分別對應著 Red(紅)、Green(綠)、Blue(藍),也就是我們平時所說的三原色,調整這三種顏色的比例 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...