Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android telephony_android获取真实时间

Android telephony_android获取真实时间

作者头像
全栈程序员站长
发布于 2022-09-27 08:47:53
发布于 2022-09-27 08:47:53
78900
代码可运行
举报
运行总次数:0
代码可运行

做一波获取手机卡LET的信息操作。看了一波源码写出来的一些东西

首先需要的一些权限(危险权限动态获取一下,之前的里面有):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

//首先获取手机管理者类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

//获取设备编号

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tm.getDeviceId();

//SIM卡提供商的ISO国家代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tm.getSimCountryIso();

//获取SIM卡序列号

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tm.getSimSerialNumber();

//获取网络运营商代号(MCC+MNC)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tm.getNetworkOperator();

//获取网络运营商名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tm.getNetworkOperatorName();

//获取设备当前所在位置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tm.getCellLocation();

//获取cId,lac,psc,基于位置信息获取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CellLocation cellLocation = tm.getCellLocation();
if(cellLocation instanceof GsmCellLocation) {
    GsmCellLocation location = (GsmCellLocation)cellLocation;
    int cid = location.getCid();
    int lac = location.getLac();
    int psc = location.getPsc();
}

//获取手机类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tm.getPhoneType();

//获取手机号码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tm.getLine1Number();

//获取国际长途区号

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tm.getNetworkCountryIso();

//获取连接状态

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tm.getDataState();

//获取网络类型(SDK版本29,才有5G,5G代号NR)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tm.getNetworkType();

//获取临近小区信息

之前的tm.getNeighboringCellInfo();这个方法在SDK29版本里删除掉了,所以得用另一种方法获取。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<CellInfo> allCellInfo = tm.getAllCellInfo();
//集合返回的第一个数据,allCellInfo.get(0)就是当前小区的数据
        String ss = allCellInfo.toString();
        for(CellInfo cellInfo : allCellInfo){
            if(cellInfo instanceof CellInfoGsm) {
                CellInfoGsm infoGsm = (CellInfoGsm) cellInfo;
                CellIdentityGsm cellIdentity = infoGsm.getCellIdentity();
                int cid = cellIdentity.getCid();
                int lac = cellIdentity.getLac();
                int psc = cellIdentity.getPsc();
                int arfcn = cellIdentity.getArfcn();
                int rsrp = infoGsm.getCellSignalStrength().getDbm();
                str = "2G=====cid:"+cid+"=====lac:"+lac+"=====psc:"+psc+"=====arfcn:"+arfcn+"=====rsrp:"+rsrp+"\n";
            }else if(cellInfo instanceof CellInfoWcdma){
                CellInfoWcdma cellInfoWcdma = (CellInfoWcdma) cellInfo;
                int cid = cellInfoWcdma.getCellIdentity().getCid();
                int lac = cellInfoWcdma.getCellIdentity().getLac();
                int psc = cellInfoWcdma.getCellIdentity().getPsc();
                int rsrp = cellInfoWcdma.getCellSignalStrength().getDbm();
                serverCellInfo.asulevel = cellInfoWcdma.getCellSignalStrength().getAsuLevel();
                str = "3G=====cid:"+cid+"=====lac:"+lac+"=====psc:"+psc+"=====rsrp:"+rsrp+"\n";
            }else if(cellInfo instanceof CellInfoLte){
                CellInfoLte cellInfoLte = (CellInfoLte) cellInfo;
                int cid = cellInfoLte.getCellIdentity().getCi();
                int pci = cellInfoLte.getCellIdentity().getPci();
                int tac = cellInfoLte.getCellIdentity().getTac();
                int earfcn = cellInfoLte.getCellIdentity().getEarfcn();
                int rsrp = cellInfoLte.getCellSignalStrength().getRsrp();
                int rsrq = cellInfoLte.getCellSignalStrength().getRsrq();
//                Object rssi = cellInfoLte.getCellSignalStrength().getRssi();
                Object rssnr = cellInfoLte.getCellSignalStrength().getRssnr();
                Object bandwidth = cellInfoLte.getCellIdentity().getBandwidth();
                str = "4G=====cid:"+cid+"=====pci:"+pci+"=====tac:"+tac+"=====earfcn:"+earfcn+"=====rsrp:"+rsrp+"=====rsrq:"
                        +rsrq+"=====rssnr:"+rssnr+"=====bandWidth:"+bandwidth+"\n";

            }else if(cellInfo instanceof CellInfoNr){
                CellInfoNr cellInfoNr = (CellInfoNr) cellInfo;
                int asuLevel = cellInfoNr.getCellSignalStrength().getAsuLevel();
                int rsrp = cellInfoNr.getCellSignalStrength().getDbm();
                int level = cellInfoNr.getCellSignalStrength().getLevel();
                str = "5G=====asuLevel:"+asuLevel+"=====rsrp:"+rsrp+"=====level:"+level;
            }
        }

注:商用手机无法获得5G下的小区信息,可以检测到是NR(5G)网络,但是即使在5G情况下获得的仍是4G锚点小区的信息!!!想要获取需要跟手机厂家去购买获取Root过的手机。

//上面那个方法没法获取rssi,总是报错,获取sinr,cqi,rsrp,rssi等信息

//注册一个监听,利用反射拿到这些数据,在监听后拿数据即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyPhoneStateListener extends PhoneStateListener {
    @Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
        super.onSignalStrengthsChanged(signalStrength);
        if (phoneGeneralInfo.ratType == TelephonyManager.NETWORK_TYPE_LTE) {
            try {
                int rssi = (Integer) signalStrength.getClass().getMethod("getLteSignalStrength").invoke(signalStrength);
                int rsrp = (Integer) signalStrength.getClass().getMethod("getLteRsrp").invoke(signalStrength);
                int rsrq = (Integer) signalStrength.getClass().getMethod("getLteRsrq").invoke(signalStrength);
                int sinr = (Integer) signalStrength.getClass().getMethod("getLteRssnr").invoke(signalStrength);
                int cqi = (Integer) signalStrength.getClass().getMethod("getLteCqi").invoke(signalStrength);
            } catch (Exception e) {
                e.printStackTrace();
                return;
            }
        } else if (phoneGeneralInfo.ratType == TelephonyManager.NETWORK_TYPE_GSM) {
            try {
                serverCellInfo.rssi = signalStrength.getGsmSignalStrength();
                serverCellInfo.rsrp = (Integer) signalStrength.getClass().getMethod("getGsmDbm").invoke(signalStrength);
                serverCellInfo.asulevel = (Integer) signalStrength.getClass().getMethod("getAsuLevel").invoke(signalStrength);
            } catch (Exception e) {
                e.printStackTrace();
                return;
            }
        } else if (phoneGeneralInfo.ratType == TelephonyManager.NETWORK_TYPE_TD_SCDMA) {
            try {
                int rssi = (Integer) signalStrength.getClass().getMethod("getTdScdmaLevel").invoke(signalStrength);
                int rsrp = (Integer) signalStrength.getClass().getMethod("getTdScdmaDbm").invoke(signalStrength);
                int asulevel = (Integer) signalStrength.getClass().getMethod("getAsuLevel").invoke(signalStrength);
            } catch (Exception e) {
                e.printStackTrace();
                return;
            }
        }
    }
}

//监听使用方法,需要调用一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MyPhoneStateListener myPhoneStateListener = new MyPhoneStateListener();
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tm.listen(myPhoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/185296.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
编辑精选文章
换一批
Android开发笔记(四十六)手机相关事件
有一类事件必须依赖于手机信号方能触发,如果把设备中的sim卡拔出,或者该设备本身不支持sim卡(如ipad),那么这类事件将永远不会被触发。在Android中,这类事件包括定位事件和手机信号事件。 与定位有关的类主要有: 1、定位条件器Criteria : 该类用于设置定位的前提条件,比如精度、速度、海拔、方位等等信息。 2、定位管理器LocationManager : 该类用于获取定位信息的提供者,设置监听器,并获取最近一次的位置信息。 3、定位监听器LocationListener : 该类用于监听定位信息的变化事件,如定位提供者的开关、位置信息发生变化等等。
aqi00
2019/01/18
2.2K0
Android 获取MEID以及IMEI
只需要五行代码 不过要注意加权限 <!-- 允许程序读写手机状态和身份 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 代码如下 //实例化TelephonyManager对象 TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); M
longzeqiu
2019/08/14
5.8K1
android中几种定位方式详解
目前,移动端大致通过三种方式来进行设备定位:GPS、基站、wifi。本文就详细的讲解一下这几种定位方式和实现方法。
BennuCTech
2021/12/10
8.1K0
android中几种定位方式详解
Android来电监听和去电监听
用户1155943
2018/01/04
5.1K0
【详解】Android自动挂断电话的实现
在开发Android应用时,有时会遇到需要实现自动挂断电话的需求。例如,在某些特定情况下(如用户正在使用某个重要功能时),不希望电话打断用户的操作。本文将介绍如何在Android中实现自动挂断电话的功能。
大盘鸡拌面
2025/04/21
2550
android的电话监听
android的电话监听 新建一个项目,结构图如下: image PhoneService: package com.demo.tingdianhua; import android.app.Ser
Dream城堡
2019/01/28
1.3K1
Android 电话自己主动接听和挂断具体解释「建议收藏」
详细分三步: (1)ITelephony.aidl ,必须新建com.android.internal.telephony包并放入ITelephony.aidl文件(构建后在gen下有ITelephony.java文件,这是aidl生成的接口),文件内容例如以下: package com.android.internal.telephony; interface ITelephony{ boolean endCall(); void answerRingingCall(); } (2)在须要的类中加入例如以下方法,代码例如以下(通过反射获取电话接口的实例)
全栈程序员站长
2022/07/08
1.2K0
Android系统服务
本篇博文主要介绍的是Android中的Java服务。 这部分服务大部分都有一个Manager类,其实就是一个RPC调用,用户通过调用xxxManager的方法,实际上被Binder给迁移到system_server进程中对应的xxxManagerService中对应的方法,并将结果再通过binder带回。
小小工匠
2021/08/16
2.1K0
Android | 网络类型判断工具类
在 Android 中获取网络类型时,我们通常先使用 ConnectivityManager.getActiveNetworkInfo() 判断是不是 Wifi , 再通过 TelephonyManager.getNetworkType() 判断具体是 3G 还是 4G。
CnPeng
2021/02/03
5.1K0
android 监听网络状态的变化及实战
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/53008266
程序员徐公
2018/09/17
4.9K0
android 监听网络状态的变化及实战
XYLibrary笔记九:XNewWork使用笔记
一.代码 XTester-network xlib-Network 二.demo 三.方法 打开网络设置界面 /** * Open the settings of wireless. */ public static void openWirelessSettings() { getApp().startActivity( new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS)
项勇
2023/03/24
4430
XYLibrary笔记九:XNewWork使用笔记
有赞移动隐私制约探索与实践
近两年工信部连续颁布 App 违法违规收集个人信息法令,各大 App 厂商都开始跟进整治,但是在整治过程中自身主动发现合规问题的能力有限,每次新版本发布都需要配合三方检测平台或者应用市场自检测能力进行复检,检测出来的新问题需要第一时间进行修复,严重情况可能导致 App 无法正常上架。在问题的修复过程中,开发人员也比较被动,每次都是高优插入,对解决问题小伙伴的开发节奏也会造成干扰。
有赞coder
2022/04/06
1.5K0
有赞移动隐私制约探索与实践
Android平台如何实时叠加电量信息和设备信号状态到GB28181接入端
我们在Android平台实现GB28181设备接入,把摄像头和麦克风数据,采集过去,用于移动单兵、智能车载、智慧安防、智能家居、工业仿真等行业时,发现大多场景对视频水印的要求越来越高,从之前的固定位置静态文字水印、png水印等慢慢过渡到动态水印需求。
音视频牛哥
2023/08/02
2910
Android平台如何实时叠加电量信息和设备信号状态到GB28181接入端
Android各版本查询和开启悬浮窗权限
如果你是从事Android开发的程序员,那么你肯定对于权限这个词不会陌生,Android的权限分为一般权限和危险权限,一般权限(只需在AndroidManifest.xml文件中声明即可),危险权限(需要手动申请),接下来进入正题。
晨曦_LLW
2020/09/25
10.4K3
某风控SDK逆向分析
  国内某知名风控SDK,本地从Java层和Native层收集大量设备信息,上传至服务器后生成设备指纹。SDK混淆非常严重,Java层的字符串加密可以被JEB自动解密,影响不大,但是类名和变量名全是0和O只能硬着头皮看
大A
2023/02/14
3.3K0
某风控SDK逆向分析
android电话拦截
其实大家可以下载 xxx卫士看下,它设置来电拒接模式后,都是会启动设置MMI指令的界面。然后再去“设置->通话设置->来电转接”,看看 “占线时转接” 设置好的电话号码,就可以知道空号/已关机/已停机对应的电话号码是什么了。  1、修改一下BLOCKED_NUMBER这个变量值,把它设置为你要测试拦截的电话号码。  2、全部功能是在一个Activity里实现的,所以大家要先运行这个Activity,然后点击“设置呼叫转移”,设置好呼叫转移后,不要关闭这个Activity,关了就拦截不了电话了。有心的朋
xiangzhihong
2018/01/29
1.8K0
相关推荐
Android开发笔记(四十六)手机相关事件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档