การดึงค่าความแรงสัญญาณ (Signal Strength) ใน Android
ตัวอย่างสาธิตการใช้ TelephonyManager.getSignalStrength() (API 29+) เพื่อดึงข้อมูลสัญญาณรายละเอียด
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่
Android Studio → File → New Project (Min SDK 29+)
ขั้นตอนที่ 2: Layout XML (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<TextView
android:id="@+id/text"
android:textSize="16sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
ขั้นตอนที่ 3: AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- ACCESS_FINE_LOCATION สำหรับผลลัพธ์แม่นยำกว่า -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application ...>
<activity android:name=".MainActivity"> ... </activity>
</application>
</manifest>
ขั้นตอนที่ 4: โค้ด Java (src/MainActivity.java)
package com.example.myapplication;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private static final int PERMISSION_REQUEST_CODE = 100;
TextView textView;
TelephonyManager telephonyManager;
@RequiresApi(api = Build.VERSION_CODES.Q) // API 29+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text);
telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
checkPermissionAndFetch();
}
private void checkPermissionAndFetch() {
String[] perms = {Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_COARSE_LOCATION};
boolean granted = true;
for (String p : perms) {
if (ActivityCompat.checkSelfPermission(this, p) != PackageManager.PERMISSION_GRANTED) {
granted = false; break;
}
}
if (!granted) {
ActivityCompat.requestPermissions(this, perms, PERMISSION_REQUEST_CODE);
} else {
fetchSignalStrength();
}
}
@RequiresApi(api = Build.VERSION_CODES.Q)
private void fetchSignalStrength() {
SignalStrength signalStrength = telephonyManager.getSignalStrength();
if (signalStrength != null) {
StringBuilder sb = new StringBuilder();
sb.append("Signal Strength Info:\n\n");
// General
sb.append("Level (0-4): ").append(signalStrength.getLevel()).append("\n");
sb.append("ASU Level: ").append(signalStrength.getAsuLevel()).append("\n\n");
// LTE (4G)
sb.append("--- LTE ---\n");
sb.append("Rsrp: ").append(signalStrength.getLteRsrp()).append(" dBm\n"); // Reference Signal Received Power
sb.append("Rsrq: ").append(signalStrength.getLteRsrq()).append(" dB\n"); // Reference Signal Received Quality
sb.append("Rssnr: ").append(signalStrength.getLteRssnr()).append(" dB\n"); // Reference Signal SNR
sb.append("Cqi: ").append(signalStrength.getLteCqi()).append("\n\n"); // Channel Quality Indicator
// NR (5G) - API 30+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
sb.append("--- 5G NR ---\n");
sb.append("Rsrp: ").append(signalStrength.getNrRsrp()).append(" dBm\n");
sb.append("Rsrq: ").append(signalStrength.getNrRsrq()).append(" dB\n");
sb.append("Sinr: ").append(signalStrength.getNrSinr()).append(" dB\n\n");
}
// WCDMA (3G)
sb.append("--- WCDMA ---\n");
sb.append("RSCP: ").append(signalStrength.getWcdmaRscp()).append(" dBm\n"); // Received Signal Code Power
sb.append("Ec/Io: ").append(signalStrength.getWcdmaEcio()).append(" dB\n\n");
// GSM (2G)
sb.append("--- GSM ---\n");
sb.append("RSSI: ").append(signalStrength.getGsmSignalStrength()).append(" ASU\n");
sb.append("BER: ").append(signalStrength.getGsmBitErrorRate()).append("\n\n");
// CDMA
sb.append("--- CDMA ---\n");
sb.append("Dbm: ").append(signalStrength.getCdmaDbm()).append(" dBm\n");
sb.append("Ecio: ").append(signalStrength.getCdmaEcio()).append(" dB\n");
sb.append("Level: ").append(signalStrength.getCdmaLevel()).append("\n\n");
// EVDO
sb.append("--- EVDO ---\n");
sb.append("Dbm: ").append(signalStrength.getEvdoDbm()).append(" dBm\n");
sb.append("Ecio: ").append(signalStrength.getEvdoEcio()).append(" dB\n");
sb.append("Snr: ").append(signalStrength.getEvdoSnr()).append(" dB\n");
textView.setText(sb.toString());
} else {
textView.setText("SignalStrength object is null");
}
}
@RequiresApi(api = Build.VERSION_CODES.Q)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_REQUEST_CODE) {
boolean granted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
if (granted) fetchSignalStrength();
else textView.setText("Permission denied");
}
}
}
การทดสอบ
รันบน Android 10+ (API 29+) อนุญาต Permission (Location + Phone State) จะแสดงค่าสัญญาณรายละเอียด

คำอธิบายค่าสัญญาณสำคัญ
| พารามิเตอร์ | หน่วย | ค่าที่ดี | คำอธิบาย |
|---|---|---|---|
| Level | 0-4 | 3-4 | ระดับสัญญาณรวม (สำหรับ Signal Bar) |
| ASU Level | int | > 15 | Arbitrary Strength Unit |
| LTE RSRP | dBm | > -90 | Reference Signal Received Power (หลัก) |
| LTE RSRQ | dB | > -10 | Reference Signal Received Quality |
| LTE RSSNR | dB | > 10 | Reference Signal SNR |
| LTE CQI | 0-15 | > 10 | Channel Quality Indicator |
| NR RSRP | dBm | > -90 | 5G Reference Signal Received Power |
| WCDMA RSCP | dBm | > -90 | 3G Received Signal Code Power |
| GSM RSSI | ASU (0-31) | > 15 | 2G Signal Strength |
เกณฑ์ค่าสัญญาณ (Rule of Thumb)
- Excellent: RSRP > -80 dBm
- Good: -80 to -90 dBm
- Fair: -90 to -100 dBm
- Poor: -100 to -110 dBm
- No Signal: < -110 dBm
Alternative: PhoneStateListener (Real-time Updates)
telephonyManager.listen(new PhoneStateListener() {
@RequiresApi(api = Build.VERSION_CODES.Q)
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
super.onSignalStrengthsChanged(signalStrength);
// อัปเดต UI แบบ Real-time
runOnUiThread(() -> updateUI(signalStrength));
}
}, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
ข้อจำกัด
- ต้อง Android 10+ (API 29+) สำหรับ getSignalStrength()
- ต้อง Permission READ_PHONE_STATE + LOCATION
- บางค่าอาจคืนค่า
Integer.MAX_VALUE(99) = ไม่รองรับ/ไม่มีข้อมูล - Dual SIM: ใช้
createForSubscriptionId()