Verizonの新しいLTE HTC Thunderboltのハンドセットを使用しています。ハンドセットがLTEを使用しているときに、信号強度を照会するAPIが見つかりません。フィールドテストモードに入ると(##4636##)、信号強度は-98dBm 2 asuと表示されます。この情報を取得するために使用できるAPIを知っている人はいますか?
警告:このソリューションはAndroid API17未満で機能するはずです。一部の人々は新しいAPIまたは特定の電話ブランド(Huaweiなど)で問題が発生する可能性があります
このコードを使用する必要があります。実際、必要なすべての情報はここにあります:
String ssignal = signalStrength.toString();
String[] parts = ssignal.split(" ");
parts[]
arrayには、次の要素が含まれます。
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|cdma
parts[14] = _not really sure what this number is_
したがって、LTEDBmは次のとおりです。
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
int dbm = 0;
if ( tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_LTE){
// For Lte SignalStrength: dbm = ASU - 140.
dbm = Integer.parseInt(parts[8])-140;
}
else{
// For GSM Signal Strength: dbm = (2*ASU)-113.
if (signalStrength.getGsmSignalStrength() != 99) {
int intdbm = -113 + 2
* signalStrength.getGsmSignalStrength();
dbm = Integer.toString(intdbm);
}
}
さようなら
この質問を解決するために、Signal Strength Detectorと呼ばれるアプリケーションを作成し、ソースコードを GitHub に設定しました。私の過去の経験では、Android ICS 4.0以降を実行している一部のデバイスには、信号強度を報告する0〜4の整数を返すgetLevel
にSignalStrength
メソッドがあります。他のいくつかのLTEデバイス(HTC Thunderboltを信じていません))には、getLteCqi
getLteRsrp
getLteRsrq
やgetLteRssnr
のようないくつかのメソッドがあり、これらの値を使用して計算する方法を決定するためにあなたに任せます最後に、一部のデバイス(HTC Thunderboltを信じています)では、LTE信号強度は、GSM信号強度のラベルが付いたメソッドで実際に報告されることがわかりました。クレイジーですが本当です。感じてください。信号強度検出器を無料でダウンロードして、デバイスで結果を確認したり、必要に応じてコードを変更したりできます。
補足として、これらのメソッドにアクセスするにはReflectionを使用する必要があります。これも、これを最適に実装する方法を決定するためにあなたに任せます。かなり簡単ですが、メソッドが存在するかどうかを判断するために多くのtry-catchを実行する必要があり、プライベートメソッドの問題を無視するためにsetAccessible(true)
を実行する必要があります。
お役に立てれば!
これは、リフレクションを使用してLTE信号強度を取得するサンプルアプリの完全に機能する実装です:
import Java.lang.reflect.Method;
import Android.app.Activity;
import Android.content.Context;
import Android.os.Bundle;
import Android.telephony.PhoneStateListener;
import Android.telephony.SignalStrength;
import Android.telephony.TelephonyManager;
import Android.util.Log;
public class MainActivity extends Activity
{
/*
* Some significant methods for LTE: getLteSignalStrength, getLteRssi,
* getLteRsrp and getRsrq. RSRP provides information about signal strength
* and RSSI helps in determining interference and noise information. RSRQ
* (Reference Signal Receive Quality) measurement and calculation is based
* on both RSRP and RSSI.
*/
private SignalStrength signalStrength;
private TelephonyManager telephonyManager;
private final static String LTE_TAG = "LTE_Tag";
private final static String LTE_SIGNAL_STRENGTH = "getLteSignalStrength";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
// Listener for the signal strength.
final PhoneStateListener mListener = new PhoneStateListener()
{
@Override
public void onSignalStrengthsChanged(SignalStrength sStrength)
{
signalStrength = sStrength;
getLTEsignalStrength();
}
};
// Register the listener for the telephony manager
telephonyManager.listen(mListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
}
private void getLTEsignalStrength()
{
try
{
Method[] methods = Android.telephony.SignalStrength.class.getMethods();
for (Method mthd : methods)
{
if (mthd.getName().equals(LTE_SIGNAL_STRENGTH))
{
int LTEsignalStrength = (Integer) mthd.invoke(signalStrength, new Object[] {});
Log.i(LTE_TAG, "signalStrength = " + LTEsignalStrength);
return;
}
}
}
catch (Exception e)
{
Log.e(LTE_TAG, "Exception: " + e.toString());
}
}
}
PhoneStateListener を LISTEN_SIGNAL_STRENGTHS に登録する必要があります。次に、現在の信号強度を含むコールバックと、更新を含む将来のコールバックを取得します。