利用onSignalStrengthsChanged、getAllCellInfo()和相关方法,我的应用程序监视细胞信号数据并实时显示结果。我的代码在针对 API 28 及更低版本时工作得非常好,可以在数据发生变化时自动刷新数据。以 API 29 为目标会导致部分Android 10 设备无法更新数据,但并非全部。
我发现TelephonyManager.requestCellInfoUpdate()已添加到 API 29,可能(?)需要它来解决此问题。但是,除了Android Reference 上的简洁定义之外,我无法找到有关此方法的任何信息。是否需要使用该方法来刷新cell信息?是否有任何代码示例或进一步的解释?
如果该方法不相关,API 29 中是否存在可能导致此行为的其他更改?ACCESS_FINE_LOCATION已确认获得批准,这似乎是唯一的其他相关 API 更改。
我在运行 Android 12 (API 32) 的 Google Pixel 6 上的 Android 应用程序的 logcat 输出中反复看到以下警告消息:
W/TextView: onProvideContentCaptureStructure(): calling assumeLayout()
没有记录更多信息。每当我的应用程序的活动打开或刷新时,它都会出现多次。该活动包含嵌套在 中的多个TextView元素。RelativeLayoutScrollView
我无法找到有关此警告消息的任何指导。问题是什么,和/或我该如何解决它?
我的Android应用监控蜂窝信号强度.在CDMA设备上,它没有任何问题.在许多 GSM设备上,它没有任何问题.但是,在某些 GSM设备上,我收到强制关闭,并显示以下错误消息:
java.lang.ClassCastException:android.telephony.cdma.CdmaCellLocation无法强制转换为android.telephony.gsm.GsmCellLocation
我相当肯定这个问题发生在美国的一些三星设备上,当他们收到4G LTE信号时; 我相信它也会出现在其他设备和国家.我仍在尝试确定所涉及的确切服务提供商和设备.
以下是MyService.java的相关代码片段; 我已将错误消息引用的行标记为//********:
public void onCreate() {
tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
...
}
public int onStartCommand(Intent in, int flags, int startId) {
signalStrengthListener = new SignalStrengthListener();
((TelephonyManager)getSystemService(TELEPHONY_SERVICE)).listen(signalStrengthListener, SignalStrengthListener.LISTEN_SIGNAL_STRENGTHS | SignalStrengthListener.LISTEN_SERVICE_STATE | SignalStrengthListener.LISTEN_DATA_CONNECTION_STATE | SignalStrengthListener.LISTEN_CELL_LOCATION);
return START_STICKY;
...
}
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
isGSM = signalStrength.isGsm();
if (isGSM == true) {
GCellLoc = (GsmCellLocation)tm.getCellLocation(); //********
...
}
Run Code Online (Sandbox Code Playgroud)
android.telephony.cdma如果仅在isGSM返回true 时触发此代码,则不确定为什么会出现任何内容.也许当检测到LTE信号时,就Android API而言,这会使手机处于某种双CDMA/GSM模式?我无法找到任何类似行为的文档.我怎么能在我的代码中处理这个?谢谢.