电话服务TelephonyManager
TelephonyManager
TelephonyManager类提供了对设备上的电话服务信息的访问。应用程序可以使用这个类中的方法来确定电话服务和状态,以及访问某些类型的用户信息。应用程序也可以注册一个监听程序来接收通知的电话状态变化。
你不能直接实例化这个类,可以通过以下方法获取服务对象:
Context.getSystemService(Context.TELEPHONY_SERVICE);
TelephonyManager常用API
1、 getCallState() :电话状态
CALL_ STATE IDLE挂机,CALL, STATE_ RINGING 响铃,CALL_ STATE_ OFFHOOK接听。
2、getDeviceld() :唯一的设备ID
GSM手机的IMEI和CDMA手机的MEID。
3、getDeviceSoftwareVersion() :设备的软件版本号。
4、getLine1Number ():手机号,GSM手机的MSISDN
5、getNetworkCountryIso() ;获取ISO标准的国家码, 即国际长途区号。
注意:似当用户已在网络注册后有效。在CDMA网络中结果也许不可靠。
6、getNetworkType() :当前使用的网络类型
7、 getPhoneType(): 手机类型(无信号,GSM信号,CDMA信号)
8、getSimState() : SIM的状态信息
SIM_ STATE_UNKNOWN 未知状态0
SIM_STATE_ABSENT 没播卡1
SIM_ STATE_ PIN REQUIRED 锁定状态,需要用户的PIN码解锁2
SIM_ STATE_ PUK REQURED 锁定状态,需要用户的PUK码解锁3
SIM_ STATE_ NETWORK. LOCKED锁定状态, 需要网络的PIN码解锁4
SIM_STATE_ READY 就绪状态5
9、getSubscriberld() :唯一的用户ID, IMSI(国际移 动用户识别码) for a GSM phone
需要权限: READ_ PHONE, STATE
SIM卡的状态必须是SIM_ STATE_ READY[使用getSimState()判断)
10、getSimSerialNumber() : SIM卡的序列号
需要权限: READ PHONE_ STATE
11、getSimOperatorName() :服务商名称,
SIM卡的状态必须是SIM STATE READY
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_telephony_manager);
testTelephonyManager();
}
@SuppressLint("MissingPermission")
public void testTelephonyManager(){
TelephonyManager tm= (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
System.out.println("电话状态:"+tm.getCallState());
System.out.println("唯一的设备:"+tm.getDeviceId());
System.out.println("设备的软件版本号:"+tm.getDeviceSoftwareVersion());
System.out.println("手机号:"+tm.getLine1Number());
System.out.println("获取ISO标准的国家码, 即国际长途区号:"+tm.getNetworkCountryIso());
System.out.println("当前使用的网络类型:"+tm.getNetworkType());
System.out.println("手机类型:"+tm.getPhoneType());
System.out.println("SIM的状态信息:"+tm.getSimState());
System.out.println("唯一的用户ID:"+tm.getSubscriberId());
System.out.println("SIM卡的序列号:"+tm.getSimSerialNumber());
System.out.println("服务商名称:"+tm.getSimOperatorName());
}
电话监听
通过给TelephonyManager添加电话状态监听:可使用listen(PhoneStateListener .event)方法
监听电话状态的事件: PhoneStateListener.LISTEN CALL STATE
class MyPhoneStateListener extends PhoneStateListener{
public void oncallStatqChanged(int state, String incomingNumber){
}
/*
* 电话服务监听器
* */
private static class MyPhoneStateListener extends PhoneStateListener{
@Override
public void onCallStateChanged(int state, String phoneNumber) {
super.onCallStateChanged(state, phoneNumber);
switch (state){
case TelephonyManager.CALL_STATE_IDLE:
System.out.println("正在接听电话。。。");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
System.out.println("挂机状态");
break;
case TelephonyManager.CALL_STATE_RINGING:
System.out.println("正在呼叫。。。");
break;
}
}
}
在testTelephonyManager电话服务管理方法中调用监听器
tm.listen(new MyPhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE);
监听来电显示
设置权限
<!--读取状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--开机启动-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<!--悬浮窗口-->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
创建一个广播接收器
package com.example.actionbar;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.WindowManager;
import android.widget.TextView;
public class PhoneListenerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取电话管理器,注册监听器
TelephonyManager tm= (TelephonyManager) context.getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(new MyphoneStateLinstener(context),PhoneStateListener.LISTEN_CALL_STATE);
throw new UnsupportedOperationException("Not yet implemented");
}
static WindowManager wm=null;//定义窗口管理器
private class MyphoneStateLinstener extends PhoneStateListener{
private Context context;
TextView textView=null;
public MyphoneStateLinstener(Context context) {
this.context=context;
}
@Override
public void onCallStateChanged(int state, String phoneNumber) {
super.onCallStateChanged(state, phoneNumber);
//响铃状态
if (state==TelephonyManager.CALL_STATE_RINGING){
wm= (WindowManager) context.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;
textView=new TextView(context);
textView.setText("当前来电号码为:"+phoneNumber);
wm.addView(textView,params);//添加手动视图
//挂机状态
}else if (state==TelephonyManager.CALL_STATE_IDLE){
if (wm!=null){
wm.removeView(textView);
wm=null;
}
}
}
}
}
<receiver
android:name=".PhoneListenerReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
在testTelephonyManager()方法下
//测试来电显示
sendBroadcast(new Intent(this,PhoneListenerReceiver.class));