Android学习——电话服务

电话服务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));
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值