[Android] TelephonyManager通信管理

1. TelephonyManager简介

在 Android 中,TelephonyManager 是一个系统服务类,用于访问与移动通信相关的信息和功能。通过 TelephonyManager,开发者可以获取设备的电话状态、SIM 卡信息、网络运营商信息等,并且可以执行一些与电话通信和数据连接相关的操作。

要使用 TelephonyManager,首先需要获取它的实例。以下是获取 TelephonyManager 实例的代码:

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

接下来,我们将介绍 TelephonyManager 的一些主要功能和常用方法:

  1. 获取电话状态:
int callState = telephonyManager.getCallState();

这个方法返回当前电话的状态,包括 CALL_STATE_IDLE(空闲状态)、CALL_STATE_RINGING(响铃状态)、CALL_STATE_OFFHOOK(通话状态)等。

  1. 获取 SIM 卡信息:
String simOperatorName = telephonyManager.getSimOperatorName();
String simSerialNumber = telephonyManager.getSimSerialNumber();
String simCountryIso = telephonyManager.getSimCountryIso();
String simOperator = telephonyManager.getSimOperator();
int simState = telephonyManager.getSimState();

这些方法可以获取 SIM 卡的相关信息,如运营商名称、序列号、国家代码、运营商代码等。getSimState() 方法返回 SIM 卡状态,包括 SIM_STATE_UNKNOWN(未知状态)、SIM_STATE_ABSENT(无 SIM 卡)、SIM_STATE_PIN_REQUIRED(需要 PIN 解锁)、SIM_STATE_PUK_REQUIRED(需要 PUK 解锁)等。

  1. 获取设备的网络运营商信息:
String networkOperatorName = telephonyManager.getNetworkOperatorName();
String networkCountryIso = telephonyManager.getNetworkCountryIso();
String networkOperator = telephonyManager.getNetworkOperator();

这些方法可以获取当前设备所连接的网络运营商的相关信息,如运营商名称、国家代码、运营商代码等。

  1. 监听电话状态变化:

可以通过注册电话状态监听器来监听设备的电话状态变化。

TelephonyManager.OnCallStateChangedListener callStateListener = new TelephonyManager.OnCallStateChangedListener() {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        // 在这里处理电话状态变化事件
    }
};

telephonyManager.listen(callStateListener, PhoneStateListener.LISTEN_CALL_STATE);

  1. 获取设备 IMEI 号(需要 READ_PHONE_STATE 权限):
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
        == PackageManager.PERMISSION_GRANTED) {
    String imei = telephonyManager.getImei();
}

以上方法只是 TelephonyManager 类提供的部分功能,还有其他一些方法可以用于执行与电话通信和数据连接相关的操作。

请注意,在使用 TelephonyManager 的一些功能时,需要添加相应的权限到 AndroidManifest.xml 文件中。例如,要获取 IMEI 号码需要添加 READ_PHONE_STATE 权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

总的来说,TelephonyManager 是 Android 开发中非常有用的一个类,它提供了访问设备电话和移动通信相关信息的接口,帮助开发者实现与电话通信和数据连接相关的功能。需要注意的是,一些功能需要相应的权限,所以在使用 TelephonyManager 时,需要在 AndroidManifest.xml 文件中添加相应的权限声明。

2. 获取扫描基站信息

在 Android 中,要获取移动网络基站(Cellular Tower)的信息,可以使用 TelephonyManager 类和 CellInfo 类。请注意,这些信息可能并不在所有 Android 设备上都可用,因为不同的设备厂商可能会有不同的实现方式。

以下是获取移动网络基站信息的示例代码:

  1. 首先,在 AndroidManifest.xml 文件中添加相关权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

  1. 创建一个 Activity,并在其中获取移动网络基站信息:
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.telephony.CellInfo;
import android.telephony.CellInfoGsm;
import android.telephony.CellInfoLte;
import android.telephony.CellInfoWcdma;
import android.telephony.TelephonyManager;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private static final int PERMISSION_REQUEST_CODE = 1;
    private ListView cellInfoListView;
    private TelephonyManager telephonyManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        cellInfoListView = findViewById(R.id.cellInfoListView);
        telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

        // 检查是否具有定位权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            // 请求获取定位权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST_CODE);
        } else {
            // 已经有定位权限,获取基站信息
            getCellInfo();
        }
    }

    private void getCellInfo() {
        List<String> cellInfoList = new ArrayList<>();

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
                == PackageManager.PERMISSION_GRANTED) {
            List<CellInfo> cellInfos = telephonyManager.getAllCellInfo();
            if (cellInfos != null) {
                for (CellInfo cellInfo : cellInfos) {
                    if (cellInfo instanceof CellInfoGsm) {
                        CellInfoGsm cellInfoGsm = (CellInfoGsm) cellInfo;
                        cellInfoList.add("GSM Cell: " + cellInfoGsm.getCellIdentity().toString());
                    } else if (cellInfo instanceof CellInfoWcdma) {
                        CellInfoWcdma cellInfoWcdma = (CellInfoWcdma) cellInfo;
                        cellInfoList.add("WCDMA Cell: " + cellInfoWcdma.getCellIdentity().toString());
                    } else if (cellInfo instanceof CellInfoLte) {
                        CellInfoLte cellInfoLte = (CellInfoLte) cellInfo;
                        cellInfoList.add("LTE Cell: " + cellInfoLte.getCellIdentity().toString());
                    }
                }
            }
        }

        ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
                android.R.layout.simple_list_item_1, android.R.id.text1, cellInfoList);
        cellInfoListView.setAdapter(adapter);
    }

    // 处理权限请求结果
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 用户授予了定位权限
                getCellInfo();
            } else {
                // 用户拒绝了定位权限,可以给出提示或其他处理
            }
        }
    }
}

在这个示例中,我们创建了一个简单的应用程序,在其中获取移动网络基站信息,并将其显示在一个 ListView 中。我们通过调用 telephonyManager.getAllCellInfo() 来获取所有的基站信息,然后遍历基站信息列表,根据不同的网络类型(GSM、WCDMA、LTE)分别处理基站信息,并将其添加到显示列表中。在获取移动网络基站信息之前,我们先检查是否有定位权限,如果没有权限,则请求获取定位权限。获取权限后,调用 getCellInfo() 方法来获取并显示基站信息。

请注意,获取基站信息需要读取手机状态的权限,因此我们在获取权限时还需添加相应权限声明:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

同时,由于基站信息涉及到定位,所以也需要定位权限:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

以上示例代码中,ListView 的布局文件(activity_main.xml)如下:

<ListView
    android:id="@+id/cellInfoListView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

这样就可以在应用中获取并显示移动网络基站信息了。请注意,不同的设备厂商可能对基站信息的支持程度有所差异,因此在某些设备上可能无法获取到完整的基站信息。

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
img
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题
图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值