IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> android 10以上版本5G信号TAC、PCI等数据获取 -> 正文阅读

[移动开发]android 10以上版本5G信号TAC、PCI等数据获取

android 10以上版本5G信号TAC、PCI、RSRP、RSRQ、SINR等数据获取

前言

之前有个APP用到了获取TAC、PCI、RSRP、RSRQ、SINR等信息,4G网络已经适配过,但是5G信号的情况下会报错,发现是5G信号下,获取的方式变了,但是查了许多相关资料,也没找到相关方法,最后没办法只能看相关源码了,最后在源码里找到了相关方法,用反射获取到了,在这记录下

一、TAC、PCI数据获取

以下CellIdentityNr 也能获取到RSRP、RSRQ、SINR,但是获取到的数据不对,需要用第二点里面的方式获取

//telephonyManager 自己创建一个哈,就不写了
List<CellInfo> allCellInfo = telephonyManager.getAllCellInfo();
if (allCellInfo != null && allCellInfo.size() > 0) {
	CellInfo info = allCellInfo.get(0);
	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
		// 5G
		if (info instanceof CellInfoNr) {
			CellIdentityNr nr = (CellIdentityNr) ((CellInfoNr) info)
					.getCellIdentity();
			CellSignalStrengthNr nrStrength = (CellSignalStrengthNr) ((CellInfoNr) info)
					.getCellSignalStrength();
			
			nr.getTac();
			nr.getPci();
			Log.i("nrgsm", "CellIdentityNr-" + nr.toString());
			
		}
	}
}

二、RSRP、RSRQ、SINR数据获取

//获取TelephonyManager 
TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
int mPhoneRatType = mTelephonyManager.getNetworkType();
//创建监听
PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
	private String[] mPara = null;

	@SuppressWarnings("unchecked")
	@Override
	public void onSignalStrengthsChanged(SignalStrength sStrength) {

		if (mPhoneRatType == TelephonyManager.NETWORK_TYPE_NR) {/* 5G状态下获取 */

			try {

				Class<?> obj = Class
						.forName("android.telephony.SignalStrength");
				Method method = obj
						.getDeclaredMethod("getCellSignalStrengths");
				method.setAccessible(true);
				List<CellSignalStrength> cellListStrengths = (List<CellSignalStrength>) method
						.invoke(sStrength);
				if (cellListStrengths != null && cellListStrengths.size() > 0) {
					for (CellSignalStrength o : cellListStrengths) {
						if (o instanceof CellSignalStrengthNr) {
							CellSignalStrengthNr nr = (CellSignalStrengthNr) o;
							nr.getSsRsrp();
							nr.getSsRsrq();
							nr.getSsSinr();
						}

					}
				}

				// System.out.println(field.getName()+":"+field.get(obj.newInstance()));
			} catch (Exception e) {
				e.printStackTrace();
			}
			return;
		}
		if (mPhoneRatType == TelephonyManager.NETWORK_TYPE_LTE) {/* 4G状态下获取 */
			try {
				(Integer) sStrength.getClass()
						.getMethod("getLteRsrp").invoke(sStrength);//LteRsrp
				(Integer) sStrength.getClass()
						.getMethod("getLteRsrq").invoke(sStrength);//LteRsrq
				(Integer) sStrength.getClass()
						.getMethod("getLteRssnr").invoke(sStrength);//LteRssnr
				// serverCellInfo.cqi = (Integer) sStrength.getClass()
				// .getMethod("getLteCqi").invoke(sStrength);
			} catch (Exception e) {
				e.printStackTrace();
			}
			return;
		}
		/* 其他状态下获取 */
		int mGSMSignal = sStrength.getGsmSignalStrength();
		String[] mPara = sStrength.toString().split(" ");
		 Integer.parseInt(mPara[9]);//RSRP
		try {
			Field f = SignalStrength.class.getDeclaredField("mLteRsrq");
			Field f2 = SignalStrength.class
					.getDeclaredField("mLteRssnr");// mLteSignalStrenth
			f.setAccessible(true);
			f2.setAccessible(true);

			 Integer.parseInt(f.get(sStrength).toString());//RSRQ 

			int rsinr = Integer.parseInt(f2.get(sStrength).toString());//SINR
			//适配华为个别手机
			if (!Build.MODEL.contains("HUAWEI MT7")
					&& !Build.MODEL.contains("HUAWEI P7")
					&& !Build.MODEL.contains("HUAWEI D2")
					&& !Build.MODEL.contains("HUAWEI MT2")) {
				mLTESINR = rsinr % 10 != 0 ? rsinr / 10
						: (rsinr / 10) + 1;
			}
			int tempSinr = (Integer) sStrength.getClass()
					.getMethod("getLteRssnr").invoke(sStrength);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

};
// 开始监听
if (mTelephonyManager != null) {
	mTelephonyManager.listen(mPhoneStateListener,
			PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-26 08:57:51  更:2021-11-26 09:00:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:47:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码