Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีดึง Signal Strength (ความแรงสัญญาณ) ใน Android

การดึงค่าความแรงสัญญาณ (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) จะแสดงค่าสัญญาณรายละเอียด

วิธีดึง Signal Strength (ความแรงสัญญาณ) ใน Android

คำอธิบายค่าสัญญาณสำคัญ

พารามิเตอร์หน่วยค่าที่ดีคำอธิบาย
Level0-43-4ระดับสัญญาณรวม (สำหรับ Signal Bar)
ASU Levelint> 15Arbitrary Strength Unit
LTE RSRPdBm> -90Reference Signal Received Power (หลัก)
LTE RSRQdB> -10Reference Signal Received Quality
LTE RSSNRdB> 10Reference Signal SNR
LTE CQI0-15> 10Channel Quality Indicator
NR RSRPdBm> -905G Reference Signal Received Power
WCDMA RSCPdBm> -903G Received Signal Code Power
GSM RSSIASU (0-31)> 152G 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()