全栈工程师开发手册 (作者:栾鹏)
安卓教程全解

安卓电话和网络开发全解,包括电话硬件检测、电话服务信息、sim信息、网络服务信息、数据连接和数据传输信息。通过phone state listener监听电话状态的变化和通过广播接收BroadcastReceiver监听电话状态变化。

拨打电话

调用
startPhone("17665343626");//拨打电话的实现函数
private void startPhone(String phonenum) {//使用系统电话服务栈启动电话呼叫Intent whoyougonnacall = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+phonenum));startActivity(whoyougonnacall);
}

检测电话硬件功能的支持

  //检查电话硬件private void checkphone() {PackageManager pm = getPackageManager();boolean telephonesupported = pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);  //是否包含电话功能boolean gsmphonesupported = pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_GSM);  //是否包含gsm电话功能boolean cdmaphonesupported = pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CDMA);  //是否包含cdma电话功能Log.v("电话硬件功能", "电话功能是否支持:"+telephonesupported);Log.v("电话硬件功能", "gsm电话功能是否支持:"+gsmphonesupported);Log.v("电话硬件功能", "cdma电话功能是否支持:"+cdmaphonesupported);}

获取电话服务信息

private void phonestate() {TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);  //获取系统电话服务//获取手机类型String phonetypeStr = "unknow";int phonetype=telephonyManager.getPhoneType();switch (phonetype) {case TelephonyManager.PHONE_TYPE_CDMA:phonetypeStr="cdma";break;case TelephonyManager.PHONE_TYPE_GSM:phonetypeStr="gsm";break;case TelephonyManager.PHONE_TYPE_SIP:phonetypeStr="sip";break;case TelephonyManager.PHONE_TYPE_NONE:phonetypeStr="none";break;default:break;}//读取gsm手机的imei或cdma手机的meidString deviceid = telephonyManager.getDeviceId();//读取手机上的软件版本(注意:不是sdk版本)String softwareversion=telephonyManager.getDeviceSoftwareVersion();//获取手机号码String phonenumber = telephonyManager.getLine1Number();Log.v("电话服务信息", "手机类型:"+phonetypeStr);Log.v("电话服务信息", "meid号:"+deviceid);Log.v("电话服务信息", "软件版本:"+softwareversion);Log.v("电话服务信息", "手机号码:"+phonenumber);}

获取网络服务信息

  private void netstate() {TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);  //获取系统电话服务//获取连接网络所在国家的iso代码String networkcountry=telephonyManager.getNetworkCountryIso();//获得连接网络的运营商ID(MCC+MNC)String networkoperatorid=telephonyManager.getNetworkOperator();//获取连接网络的运营商名称String networkname = telephonyManager.getNetworkOperatorName();  //获得手机卡支持的网络类型int networkType = telephonyManager.getNetworkType();String simnettype="";switch (networkType) {case TelephonyManager.NETWORK_TYPE_UNKNOWN: simnettype="NETWORK_TYPE_UNKNOWN"; break;case TelephonyManager.NETWORK_TYPE_GPRS: simnettype="NETWORK_TYPE_GPRS"; break;case TelephonyManager.NETWORK_TYPE_EDGE: simnettype="NETWORK_TYPE_EDGE"; break;case TelephonyManager.NETWORK_TYPE_UMTS: simnettype="NETWORK_TYPE_UMTS"; break;case TelephonyManager.NETWORK_TYPE_HSDPA: simnettype="NETWORK_TYPE_HSDPA"; break;case TelephonyManager.NETWORK_TYPE_HSUPA: simnettype="NETWORK_TYPE_HSUPA"; break;case TelephonyManager.NETWORK_TYPE_HSPA: simnettype="NETWORK_TYPE_HSPA"; break;case TelephonyManager.NETWORK_TYPE_CDMA: simnettype="NETWORK_TYPE_CDMA"; break;case TelephonyManager.NETWORK_TYPE_EVDO_0: simnettype="NETWORK_TYPE_EVDO_0"; break;case TelephonyManager.NETWORK_TYPE_EVDO_A: simnettype="NETWORK_TYPE_EVDO_A"; break;case TelephonyManager.NETWORK_TYPE_EVDO_B: simnettype="NETWORK_TYPE_EVDO_B"; break;case TelephonyManager.NETWORK_TYPE_1xRTT: simnettype="NETWORK_TYPE_1xRTT"; break;case TelephonyManager.NETWORK_TYPE_IDEN: simnettype="NETWORK_TYPE_IDEN"; break;case TelephonyManager.NETWORK_TYPE_LTE: simnettype="NETWORK_TYPE_LTE"; break;case TelephonyManager.NETWORK_TYPE_EHRPD: simnettype="NETWORK_TYPE_EHRPD"; break;case TelephonyManager.NETWORK_TYPE_HSPAP: simnettype="NETWORK_TYPE_HSPAP"; break;default:break;}//当前上网的网络类型ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);  NetworkInfo networkInfo = manager.getActiveNetworkInfo();  String type="";if (networkInfo != null && networkInfo.isConnected()) type = networkInfo.getTypeName();  Log.v("网络服务信息", "国家代码:"+networkcountry);Log.v("网络服务信息", "运营商ID:"+networkoperatorid);Log.v("网络服务信息", "运营商名称:"+networkname);Log.v("网络服务信息", "手机卡网络类型:"+simnettype);Log.v("网络服务信息", "当前上网网络类型:"+type);}

获取sim卡信息

  private void simstate() {TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);  //获取系统电话服务int simstate = telephonyManager.getSimState(); String siminfo="";switch (simstate) {case TelephonyManager.SIM_STATE_ABSENT: siminfo="没有sim卡"; break;case TelephonyManager.SIM_STATE_UNKNOWN: siminfo="未知情况"; break;case TelephonyManager.SIM_STATE_PIN_REQUIRED: siminfo="需要sim卡的PIN来解锁"; break;case TelephonyManager.SIM_STATE_PUK_REQUIRED: siminfo="需要sim卡的PUK来解锁"; break;case TelephonyManager.SIM_STATE_NETWORK_LOCKED: siminfo="需要网络PIN来解锁"; break;case TelephonyManager.SIM_STATE_READY: siminfo="sim卡正常"; break;default:break;}//获取SIM的ISO国家代码String simworkcountry=telephonyManager.getSimCountryIso();//获得活动SIM的运营商ID(MCC+MNC)String simworkoperatorid=telephonyManager.getSimOperator();//获取sim运营商名称String simworkname = telephonyManager.getSimOperatorName();  //获取sim的序列号String simserial = telephonyManager.getSimSerialNumber();Log.v("sim卡信息", "国家代码:"+simworkcountry);Log.v("sim卡信息", "运营商ID:"+simworkoperatorid);Log.v("sim卡信息", "运营商名称:"+simworkname);Log.v("sim卡信息", "序列号:"+simserial);Log.v("sim卡信息", "sim卡状态:"+siminfo);}

读取数据连接和传输状态的详细信息

private void datastate() {TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);  //获取系统电话服务int dataactivity = telephonyManager.getDataActivity();int datastate = telephonyManager.getDataState();String dataactivityinfo="";switch (dataactivity) {case TelephonyManager.DATA_ACTIVITY_IN:dataactivityinfo="正在接收数据";break;case TelephonyManager.DATA_ACTIVITY_OUT:dataactivityinfo="正在发送数据";break;case TelephonyManager.DATA_ACTIVITY_INOUT:dataactivityinfo="正在同时发送和接收数据";break;case TelephonyManager.DATA_ACTIVITY_NONE:dataactivityinfo="当前没有数据传输";break;default:break;}String datainfo="";switch (datastate) {case TelephonyManager.DATA_CONNECTED:datainfo="当前可以上网";break;case TelephonyManager.DATA_CONNECTING:datainfo="正在开启上网服务";break;case TelephonyManager.DATA_DISCONNECTED:datainfo="当前不可以上网";break;case TelephonyManager.DATA_SUSPENDED:datainfo="正在电话,不能上网";break;default:break;}Log.v("数据传输信息", "数据传输状态:"+dataactivityinfo);Log.v("数据传输信息", "上网状态:"+datainfo);}

使用phone state listener监听电话状态的变化

应用程序处于运行状态才能接受这个监视器回调。

首先定义自己的监听器

可以自定义传入电话呼叫监听器、蜂窝位置变化监视器、服务变化监视器、数据传输监视函数、数据连接监视函数、

//定义监听器PhoneStateListener callStateListener = new PhoneStateListener(){//传入电话呼叫监听器,处理传入的呼叫相关的电话号码public void onCallStateChanged(int state,String incomingNumber) {String callStateStr = "Unknown";switch (state) {case TelephonyManager.CALL_STATE_IDLE:   //电话既不响铃,也不再通话中时callStateStr = "没有电话呼叫";break;case TelephonyManager.CALL_STATE_OFFHOOK:  //当电话响铃时,此时系统会显示来电屏幕callStateStr = "有电话呼入";break;case TelephonyManager.CALL_STATE_RINGING:   //当电话当前正在通话中时callStateStr = "正在通话中"+incomingNumber;break;default:break;}Log.v("电话传入电话监视:", callStateStr);}//蜂窝位置变化监视器public void onCellLocationChanged(CellLocation location) {if (location instanceof GsmCellLocation) {GsmCellLocation gsmCellLocation = (GsmCellLocation)location;Toast.makeText(getApplicationContext(), String.valueOf(gsmCellLocation.getCid()), Toast.LENGTH_LONG).show();Log.v("电话蜂窝位置监视:", "GSM:"+String.valueOf(gsmCellLocation.getCid()));}else if (location instanceof CdmaCellLocation) {CdmaCellLocation cdmaCellLocation = (CdmaCellLocation)location;StringBuilder sb=new StringBuilder();sb.append(cdmaCellLocation.getBaseStationId());   //获取基站idsb.append("\n@");sb.append(cdmaCellLocation.getBaseStationLatitude());   //获取经纬度sb.append(cdmaCellLocation.getBaseStationLongitude());Log.v("电话蜂窝位置监视:", "CDMA:"+sb.toString());}}//服务变化监视器public void onServiceStateChanged(ServiceState serviceState) {if (serviceState.getState() == ServiceState.STATE_IN_SERVICE) {String toasttext = "运营商:"+serviceState.getOperatorAlphaLong();Toast.makeText(context, toasttext, 1000).show();Log.v("电话服务监视:", toasttext);}}//数据传输监视函数public void onDataActivity(int direction) {String dataActivitystr = "none";switch (direction) {case TelephonyManager.DATA_ACTIVITY_IN:dataActivitystr="正在下载";break;case TelephonyManager.DATA_ACTIVITY_OUT:dataActivitystr="正在上传";break;case TelephonyManager.DATA_ACTIVITY_INOUT:dataActivitystr="正在下载或上传";break;case TelephonyManager.DATA_ACTIVITY_NONE:dataActivitystr="没有数据传输";break;default:break;}Log.v("电话数据传输监视:", dataActivitystr);}//数据连接监视函数public void onDataConnectionStateChanged(int state) {String datastatestr = "none";switch (state) {case TelephonyManager.DATA_CONNECTED:datastatestr="已经连接上";break;case TelephonyManager.DATA_CONNECTING:datastatestr="正在连接";break;case TelephonyManager.DATA_DISCONNECTED:datastatestr="连接失败";break;case TelephonyManager.DATA_SUSPENDED:datastatestr="暂停挂起";break;default:break;}Log.v("电话数据连接监视:", datastatestr);}};

注册监听器,实现状态变化监听。

  private void phonechange() {TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);  //获取系统电话服务telephonyManager.listen(callStateListener, PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR | //呼叫转移PhoneStateListener.LISTEN_CALL_STATE|    //电话呼叫状态变化PhoneStateListener.LISTEN_CELL_LOCATION |   //蜂窝位置变化PhoneStateListener.LISTEN_DATA_ACTIVITY |   //数据连接变化PhoneStateListener.LISTEN_DATA_CONNECTION_STATE |   //数据传输变化PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR |PhoneStateListener.LISTEN_SERVICE_STATE |   //网络服务变化PhoneStateListener.LISTEN_SIGNAL_STRENGTHS  //网络信号强度变化);    //参数:监听器,状态类型}

使用广播接收监听电话状态变化

电话状态变化,系统向手机所有app广播intent,所以可以通过广播接收,捕获这个广播消息。

1、在manifest中注册广播接收器

<!-- 电话监视-->
<receiver android:name="com.lp.app.advice.Phonestatechangereceiver" ><intent-filter><action android:name="android.intent.action.PHONE_STATE"/></intent-filter>
</receiver>

2、实现这个接收器,在接收器中区别广播intent类别,和获取广播事件信息。

import android.content.Intent;
import android.widget.Toast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.telephony.TelephonyManager;//使用广播接收BroadcastReceiver监视电话状态的变化
public class Phonestatechangereceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String phonestateString = intent.getStringExtra(TelephonyManager.EXTRA_STATE);//这里仅监听传入的电话呼入if (phonestateString.equals(TelephonyManager.EXTRA_STATE_RINGING)) {String phonenumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);Toast.makeText(context, "Incoming call from:"+phonenumber, 1000).show();}}}

安卓电话和网络开发全解:电话硬件检测、电话服务信息、sim信息、网络服务信息、数据连接和数据传输信息、电话状态监听相关推荐

  1. 安卓网络操作全解:发起请求,解析响应

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓网络操作全解. 发起请求,解析xml响应流 //发起一个请求 private void connect(String urlpath) {//启动 ...

  2. 安卓蓝牙bluetooth开发全解

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓蓝牙开发全解.启动蓝牙.启动可发现机制.广播监听蓝牙状态.广播监听蓝牙可发现机制状态.发现远程蓝牙设备.蓝牙设备作为服务器端.蓝牙设备作为客户端. ...

  3. 安卓调用系统语音识别功能全解(谷歌语音服务):获取识别结果,使用语音识别进行搜索。

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓调用系统语音识别功能全解(谷歌语音服务):获取识别结果,使用语音识别进行搜索. 首先要添加权限 <uses-permission andro ...

  4. 安卓APP在运行时对全局进行网络状态监听的实现

    转载自:https://blog.51cto.com/wangjinchan/4752142 感谢博主:一粒程序米 分享 一.前言 怎么对APP进行全局的网络监听呢?仿照微信的无网状态下弹出的提示,应 ...

  5. android 蓝牙电话号码,Android拨打电话和蓝牙状态监听

    一.拨打电话 权限管理 思路 通过Intent设置Action为ACTION_DIAL或者 ACTION_CALL,通过intent启动直接拨打电话或者打开拨打电话界面. 示例代码 直接拨打电话 /* ...

  6. android获取wifi开关,Android WiFi开发(一)--WiFi开关与状态监听

    之前开发了一个WiFi,热点相关的应用.因为对这方面也不熟悉,刚开始找资料看书,但看明白实现时,发现随着android版本更新,相关api有较大改动,之前的代码不能用.经过一番探索,最后实现出来了,现 ...

  7. 微信二次开发SDK使用教程--手机检测到有人点赞/取消点赞通知服务端

    微信二次开发SDK使用教程--手机检测到有人点赞/取消点赞通知服务端 case CircleLikeNotice : {//手机检测到有人点赞/取消点赞通知 log.debug("socke ...

  8. jQuery Mobile 所有class选项,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) jQuery Mobile事件全解 jQuery Mobile 所有class选项 jQuery Mobile 所有data-*选项 jQuery Mobile 所 ...

  9. python深度学习库keras——网络建模全解

    全栈工程师开发手册 (作者:栾鹏) python教程全解 一.数据预处理 1.序列预处理 1.1.填充序列pad_sequences keras.preprocessing.sequence.pad_ ...

最新文章

  1. 数据结构 – 顺序表
  2. 基于winpcap开发的相关资料
  3. 使用函数PIVOT现实数据行转列
  4. TP框架中同时使用“or”和“and”
  5. MathType中的一些精彩技巧
  6. python判断回文_Python实现判断一个整数是否为回文数算法示例
  7. Star UML指导手册
  8. everything is nothing
  9. Word:不显示图片 + 清空“最近使用的文档”列表
  10. AD单片机九齐单片机NY8B062D SOP16九齐
  11. html点击图片弹出模态框,JS实现图片点击后出现模态框效果
  12. 微信小程序云开发之收藏文章功能的简单实现
  13. CSR867x — 使用Sink Configuration Tool配置按键
  14. 小程序-实现左右菜单联动功能
  15. stm8 硬件SPI
  16. 开源倾情奉献:基于.NET打造IP智能网络视频监控系统
  17. 转载-解释路由包ping的情况
  18. mysql怎么定位cpu高_Mysql数据库服务器CPU冲高问题定位及分析
  19. 图算法:2、计算带有负权值的单源最短路径:Bellman-Ford算法
  20. FinalData 数据恢复

热门文章

  1. 语音识别,搜狗的下一个大梦想?
  2. O-矩阵相乘-Warshall算法详解
  3. Vue实现简单图表~满满的干货
  4. mysql bin log 255_解析MYSQL BINLOG 二进制格式(4)--TABLE_MAP_EVENT
  5. XBMC源代码简析 5:视频播放器(dvdplayer)-解复用器(以ffmpeg为例)
  6. python字符串描述错误的_Python字符串错误字符
  7. python在规划类专业的作用_城乡规划学Python、Gis有哪些具体的作用?
  8. /bin/sh: cc: 未找到命令
  9. 解决 GitHub 拉取代码网速慢的问题
  10. 【HDOJ6957】Maximal submatrix(单调栈,最大子矩阵面积)