问题
A few people over the past decade have asked similar questions but none have ANY answers. I need to write an android app that collects and stores RSRP, RSRQ, CINR, and Cell ID. The answers need to be as accurate as the phones hardware allows (I am testing on Samsung Galaxy S5) because I need to do post processing statistics with those values.
Does anyone know how to use telephonyManager or CellSignalStrengthLte to get RSRP? Or is there another, perhaps better way to get RSRP?
So far the best that I have been able to do is use a PhoneStateListener and TelephonyManager to get the RSSI values, but RSSI is useless for my statistics:
package com.pscr.jparks.signalstrength;
import android.app.Activity;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.TextView;
/*
TS 27.007 8.5
Defined values
<rssi>:
0 -113 dBm or less
1 -111 dBm
2...30 -109... -53 dBm
31 -51 dBm or greater
99 not known or not detectable
*/
public class SignalStrengthActivity extends Activity {
SignalStrengthListener signalStrengthListener;
TextView signalStrengthTextView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setup content stuff
this.setContentView(R.layout.signal_strength);
signalStrengthTextView = (TextView) findViewById(R.id.signalStrengthTextView);
//start the signal strength listener
signalStrengthListener = new SignalStrengthListener();
((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).listen(signalStrengthListener, SignalStrengthListener.LISTEN_SIGNAL_STRENGTHS);
}
private class SignalStrengthListener extends PhoneStateListener {
@Override
public void onSignalStrengthsChanged(android.telephony.SignalStrength signalStrength) {
// get the signal strength (a value between 0 and 31)
int strengthAmplitude = signalStrength.getGsmSignalStrength();
//do something with it (in this case we update a text view)
signalStrengthTextView.setText(String.valueOf(strengthAmplitude));
super.onSignalStrengthsChanged(signalStrength);
}
}
}
If anyone has solved this problem, or found an answer (I have looked everywhere!), please let me know!
回答1:
Update:
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
List<CellInfo> cellInfoList = tm.getAllCellInfo();
for (CellInfo cellInfo : cellInfoList)
{
if (cellInfo instanceof CellInfoLte)
{
// cast to CellInfoLte and call all the CellInfoLte methods you need
((CellInfoLte)cellInfo).getCellSignalStrength().getDbm();
}
}
回答2:
This is my answer together with the code by Bruce Lan. This is still a work in progress, but it shows how to gather various LTE parameters. You can get the entire Android Studio project from my GitHub account at: https://github.com/parksjg/SignalStrength
package com.pscr.jparks.signalstrength;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.CellInfo;
import android.telephony.CellInfoLte;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.TextView;
import java.util.List;
/*
TS 27.007 8.5
Defined values
<rsrp>:
0 -113 dBm or less
1 -111 dBm
2...30 -109... -53 dBm
31 -51 dBm or greater
99 not known or not detectable
*/
/*
The parts[] array will then contain these elements:
part[0] = "Signalstrength:" _ignore this, it's just the title_
parts[1] = GsmSignalStrength
parts[2] = GsmBitErrorRate
parts[3] = CdmaDbm
parts[4] = CdmaEcio
parts[5] = EvdoDbm
parts[6] = EvdoEcio
parts[7] = EvdoSnr
parts[8] = LteSignalStrength
parts[9] = LteRsrp
parts[10] = LteRsrq
parts[11] = LteRssnr
parts[12] = LteCqi
parts[13] = gsm|lte
parts[14] = _not reall sure what this number is_
*/
public class SignalStrengthActivity extends Activity {
// How do I release the Listener when app closes???????
SignalStrengthListener signalStrengthListener;
TextView signalStrengthTextView, signalStrengthTextView2;
TextView cellIDTextView;
TextView cellMccTextView;
TextView cellMncTextView;
TextView cellPciTextView;
TextView cellTacTextView;
List<CellInfo> cellInfoList;
int cellSig, cellID, cellMcc, cellMnc, cellPci, cellTac = 0;
TelephonyManager tm;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setup content stuff
this.setContentView(R.layout.signal_strength);
signalStrengthTextView = (TextView) findViewById(R.id.signalStrengthTextView);
signalStrengthTextView2 = (TextView) findViewById(R.id.signalStrengthTextView2);
cellIDTextView = (TextView) findViewById(R.id.cellIDTextView);
cellMccTextView = (TextView) findViewById(R.id.cellMccTextView);
cellMncTextView = (TextView) findViewById(R.id.cellMncTextView);
cellPciTextView = (TextView) findViewById(R.id.cellPciTextView);
cellTacTextView = (TextView) findViewById(R.id.cellTacTextView);
//start the signal strength listener
signalStrengthListener = new SignalStrengthListener();
((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).listen(signalStrengthListener, SignalStrengthListener.LISTEN_SIGNAL_STRENGTHS);
tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
try {
cellInfoList = tm.getAllCellInfo();
} catch (Exception e) {
Log.d("SignalStrength", "+++++++++++++++++++++++++++++++++++++++++ null array spot 1: " + e);
}
try {
for (CellInfo cellInfo : cellInfoList) {
if (cellInfo instanceof CellInfoLte) {
// cast to CellInfoLte and call all the CellInfoLte methods you need
// gets RSRP cell signal strength:
cellSig = ((CellInfoLte) cellInfo).getCellSignalStrength().getDbm();
// Gets the LTE cell indentity: (returns 28-bit Cell Identity, Integer.MAX_VALUE if unknown)
cellID = ((CellInfoLte) cellInfo).getCellIdentity().getCi();
// Gets the LTE MCC: (returns 3-digit Mobile Country Code, 0..999, Integer.MAX_VALUE if unknown)
cellMcc = ((CellInfoLte) cellInfo).getCellIdentity().getMcc();
// Gets theLTE MNC: (returns 2 or 3-digit Mobile Network Code, 0..999, Integer.MAX_VALUE if unknown)
cellMnc = ((CellInfoLte) cellInfo).getCellIdentity().getMnc();
// Gets the LTE PCI: (returns Physical Cell Id 0..503, Integer.MAX_VALUE if unknown)
cellPci = ((CellInfoLte) cellInfo).getCellIdentity().getPci();
// Gets the LTE TAC: (returns 16-bit Tracking Area Code, Integer.MAX_VALUE if unknown)
cellTac = ((CellInfoLte) cellInfo).getCellIdentity().getTac();
}
}
} catch (Exception e) {
Log.d("SignalStrength", "++++++++++++++++++++++ null array spot 2: " + e);
}
}
@Override
public void onPause() {
super.onPause();
try{
if(signalStrengthListener != null){tm.listen(signalStrengthListener, SignalStrengthListener.LISTEN_NONE);}
}catch(Exception e){
e.printStackTrace();
}
}
public void onDestroy() {
super.onDestroy();
try{
if(signalStrengthListener != null){tm.listen(signalStrengthListener, SignalStrengthListener.LISTEN_NONE);}
}catch(Exception e){
e.printStackTrace();
}
}
private class SignalStrengthListener extends PhoneStateListener {
@Override
public void onSignalStrengthsChanged(android.telephony.SignalStrength signalStrength) {
//++++++++++++++++++++++++++++++++++
((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).listen(signalStrengthListener, SignalStrengthListener.LISTEN_SIGNAL_STRENGTHS);
tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String ltestr = signalStrength.toString();
String[] parts = ltestr.split(" ");
String cellSig2 = parts[9];
try {
cellInfoList = tm.getAllCellInfo();
for (CellInfo cellInfo : cellInfoList) {
if (cellInfo instanceof CellInfoLte) {
// cast to CellInfoLte and call all the CellInfoLte methods you need
// gets RSRP cell signal strength:
cellSig = ((CellInfoLte) cellInfo).getCellSignalStrength().getDbm();
// Gets the LTE cell identity: (returns 28-bit Cell Identity, Integer.MAX_VALUE if unknown)
cellID = ((CellInfoLte) cellInfo).getCellIdentity().getCi();
// Gets the LTE MCC: (returns 3-digit Mobile Country Code, 0..999, Integer.MAX_VALUE if unknown)
cellMcc = ((CellInfoLte) cellInfo).getCellIdentity().getMcc();
// Gets theLTE MNC: (returns 2 or 3-digit Mobile Network Code, 0..999, Integer.MAX_VALUE if unknown)
cellMnc = ((CellInfoLte) cellInfo).getCellIdentity().getMnc();
// Gets the LTE PCI: (returns Physical Cell Id 0..503, Integer.MAX_VALUE if unknown)
cellPci = ((CellInfoLte) cellInfo).getCellIdentity().getPci();
// Gets the LTE TAC: (returns 16-bit Tracking Area Code, Integer.MAX_VALUE if unknown)
cellTac = ((CellInfoLte) cellInfo).getCellIdentity().getTac();
}
}
} catch (Exception e) {
Log.d("SignalStrength", "+++++++++++++++++++++++++++++++ null array spot 3: " + e);
}
signalStrengthTextView.setText(String.valueOf(cellSig));
signalStrengthTextView2.setText(String.valueOf(cellSig2));
cellIDTextView.setText(String.valueOf(cellID));
cellMccTextView.setText(String.valueOf(cellMcc));
cellMncTextView.setText(String.valueOf(cellMnc));
cellPciTextView.setText(String.valueOf(cellPci));
cellTacTextView.setText(String.valueOf(cellTac));
super.onSignalStrengthsChanged(signalStrength);
//++++++++++++++++++++++++++++++++++++
}
}
}
Thanks to Bruce Lan and this website (https://sites.google.com/site/androiddevelopmentproject/home/rf-signal-tracker/a-very-basic-how-to) for helping me out!
来源:https://stackoverflow.com/questions/32531176/get-rsrp-from-cellsignalstrengthlte-for-android-app-api-17