Lightweight Android library that is build over Telephony SDK. NetMonster core is extracted from NetMonster application and backports several Telephony features to older Android devices.
Why use NetMonster Core instead of legacy API?
implementation 'app.netmonster:core:$version'
Here's small comparison for each of voice / data network you can meet.
function | Min SDK Android | Min SDK NetMonster Core |
---|---|---|
CGI | - | I (14) |
NCC | - | N (24) |
BCC | - | N (24) |
Band | - | N (24) |
TA | O (26) | N (24) |
function | Min SDK Android | Min SDK NetMonster Core |
---|---|---|
CGI | - | I (14) |
CID (16b) | - | I (14) |
RNC | - | I (14) |
Ec/Io | - | M (23) |
Band | - | N (24) |
BER | - | Q (29) |
Ec/No | - | Q (29) |
RSCP | - | Q (29) |
function | Min SDK Android | Min SDK NetMonster Core |
---|---|---|
eCGI | - | I (14) |
CID (8b) | - | I (14) |
eNb | - | I (14) |
RSSI | Q (29) | I (14) |
RSRP | O (26) | I (14) |
CQI | O (26) | I (14) |
SNR | O (26) | I (14) |
TA | O (26) | I (14) |
Band | - | N (24) |
There are basically two ways you can use this library - as a validation library that will sanitize
data from AOSP cause lots of manufacturers modify source code and do not follow public documentation.
In that case you'll only need ITelephonyManagerCompat
to retrieve AOSP-like models that are properly
validated.
The second option is to use advantages of additional postprocessing of NetMonster Core. As a result you'll get more data but correctness is not 100 % guaranteed.
NetMonster Core focuses on mapping of two AOSP's ways to fetch current cell information:
Note that some of those methods are deprecated or even removed from AOSP - for more info see documentation of each method.
NetMonsterFactory.getTelephony(context, SUBSCRIPTION_ID).apply {
val allCellInfo : List<ICell> = getAllCellInfo()
val cellLocation : List<ICell> = getCellLocation()
val neighbouringCells : List<ICell> = getNeighbouringCellInfo()
}
In this case you'll need to interact with INetMonster
class. Here's list of problems
that this library solves.
Issue:
Solution:
NetMonsterFactory.get(context).apply {
val allSources : List<ICell> = getCells() // all sources
val subset : List<ICell> = getCells( // subset of available sources
CellSource.ALL_CELL_INFO,
CellSource.CELL_LOCATION
)
}
Issue:
Solution:
Using getNetworkType(vararg detectors: INetworkDetector)
you can specify which INetworkDetector
to use
when detecting current network type.
NetMonsterFactory.get(context).apply {
// All detectors that are bundled in NetMonster Core
val networkType : NetworkType = getNetworkType(SUBSCRIPTION_ID)
// Only HSPA+42 (guess, not from RIL)
val isHspaDc: NetworkType? = getNetworkType(SUBSCRIPTION_ID, DetectorHspaDc())
// LTE-A from CellInfo (guess, not from RIL), NSA NR
val isLteCaCellInfo: NetworkType? = getNetworkType(SUBSCRIPTION_ID, DetectorCellInfo())
// LTE-A from ServiceState (from RIL, Android P+)
val isLteCaServiceState: NetworkType? = getNetworkType(SUBSCRIPTION_ID, DetectorLteAdvancedNrServiceState())
// LTE-A from PhysicalChannel (from RIL, Android P+)
val isLteCaPhysicalChannel: NetworkType? = getNetworkType(SUBSCRIPTION_ID, DetectorLteAdvancedPhysicalChannel())
// LTE-A and NR from DisplayInfo (marketing purposes, might result false-positive data, Android R+)
// You can also detect only LTE-A or NR using one of classes:
// - DetectorLteAdvancedServiceState ... for LTE-A
// - DetectorNsaNr ... for NR NSA
val isLteCaOrNsaNrDisplayInfo: NetworkType? = getNetworkType(SUBSCRIPTION_ID, DetectorLteAdvancedNrDisplayInfo())
}
Issue:
TelephonyDisplayInfo
which provide inaccurate (marketing-based) data.Solution:
NetworkType
instance.
val networkType : NetworkType = NetMonsterFactory.get(context).getNetworkType(SUBSCRIPTION_ID)
if (networkType is NetworkType.Nr.Nsa) {
val state: NrNsaState = networkType.nrNsaState // For more info refer to NrNsaState class
}
Copyright 2019 Michal Mroček
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and