Lấy Signal Strength trong Android
Hướng dẫn lấy thông tin cường độ sóng di động qua TelephonyManager.getSignalStrength(). Trả về đối tượng SignalStrength chứa chi tiết LTE, GSM, CDMA, NR (5G). Yêu cầu quyền READ_PHONE_STATE và ACCESS_COARSE_LOCATION (Android 12+).
Bước 1: Tạo dự án mới
Android Studio → File → New Project.
Bước 2: Giao diện (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:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<TextView
android:id="@+id/text"
android:textSize="16sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
Bước 3: Code logic (java/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.P)
@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);
if (!hasPermissions()) {
requestPermissions();
} else {
showSignalStrength();
}
}
private boolean hasPermissions() {
return ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED
&& (Build.VERSION.SDK_INT < Build.VERSION_CODES.S ||
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED);
}
private void requestPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_PHONE_STATE, Manifest.permission.ACCESS_COARSE_LOCATION},
PERMISSION_REQUEST_CODE);
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_PHONE_STATE},
PERMISSION_REQUEST_CODE);
}
}
@RequiresApi(api = Build.VERSION_CODES.P)
private void showSignalStrength() {
SignalStrength signalStrength = telephonyManager.getSignalStrength();
if (signalStrength != null) {
String info = "SignalStrength.toString(): " + signalStrength.toString() + "\n\n" +
"LTE RSRP: " + getLteRsrp(signalStrength) + " dBm\n" +
"LTE RSRQ: " + getLteRsrq(signalStrength) + " dB\n" +
"GSM Signal: " + signalStrength.getGsmSignalStrength() + " (0-31, 99=unknown)\n" +
"Level: " + signalStrength.getLevel() + " (0-4)";
textView.setText(info);
} else {
textView.setText("SignalStrength null");
}
}
// Helper methods (API 24+)
private int getLteRsrp(SignalStrength ss) {
try {
return (int) ss.getClass().getMethod("getLteRsrp").invoke(ss);
} catch (Exception e) { return -1; }
}
private int getLteRsrq(SignalStrength ss) {
try {
return (int) ss.getClass().getMethod("getLteRsrq").invoke(ss);
} catch (Exception e) { return -1; }
}
@RequiresApi(api = Build.VERSION_CODES.P)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_REQUEST_CODE && hasPermissions()) {
showSignalStrength();
}
}
}
Bước 4: 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.ACCESS_COARSE_LOCATION" />
<application ...>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Giải thích các chỉ số
- RSRP (Reference Signal Received Power): Công suất tín hiệu tham chiếu LTE.
-44 dBm(tốt) →-140 dBm(yếu). - RSRQ (Reference Signal Received Quality): Chất lượng tín hiệu.
-3 dB(tốt) →-19.5 dB(yếu). - GSM Signal Strength: 0-31 (31 tốt nhất), 99 = unknown.
- Level: 0-4 (Android abstract level cho hiển thị icon sóng).
⚠️ Lưu ý Android 12+ (API 31)
Yêu cầu thêm ACCESS_COARSE_LOCATION hoặc ACCESS_FINE_LOCATION để đọc signal strength.
Chạy ứng dụng
Cấp quyền → TextView hiển thị chi tiết cường độ sóng.
