Android SDK开发:如何实现手机非电离辐射(射频)测量功能
安卓应用实现射频(RF)辐射测量方案
核心前提说明
普通安卓手机没有内置专门的RF辐射测量传感器,市面上同类应用的RF测量功能,本质是通过手机蜂窝/WiFi模块的信号强度(RSSI)间接估算辐射水平,并非专业级精确测量。以下是具体实现思路和代码优化方案:
一、修正现有磁场传感器代码的bug
你当前的onSensorChanged方法存在错误,三个轴的磁场分量都误用了values[0],正确写法如下:
public class NonIonizingRadiationActivity extends AppCompatActivity implements SensorEventListener { private SensorManager manager; private Sensor magneticSensor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_non_ionizing_radiation); manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); magneticSensor = manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); } @Override public void onSensorChanged(SensorEvent sensorEvent) { // 正确获取X/Y/Z三轴的磁场分量(单位:微特斯拉μT) float magX = sensorEvent.values[0]; float magY = sensorEvent.values[1]; float magZ = sensorEvent.values[2]; // 计算合成磁场强度 double totalMagneticField = Math.sqrt(magX*magX + magY*magY + magZ*magZ); // 可将结果显示到UI上,比如TextView // textView.setText(String.format("磁场强度:%.2f μT", totalMagneticField)); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) {} @Override protected void onResume() { super.onResume(); if(magneticSensor != null){ manager.registerListener(this, magneticSensor, SensorManager.SENSOR_DELAY_NORMAL); } else { Toast.makeText(this, "设备不支持磁场传感器", Toast.LENGTH_SHORT).show(); } } @Override protected void onPause() { super.onPause(); manager.unregisterListener(this); } }
二、实现RF辐射估算功能(基于信号强度)
方案1:读取蜂窝网络信号强度(RSSI)
步骤1:申请权限
在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- Android 6.0+ 必需 -->
步骤2:代码实现
private TelephonyManager telephonyManager; private PhoneStateListener phoneStateListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_non_ionizing_radiation); // ... 原有磁场传感器初始化代码 ... telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); phoneStateListener = new PhoneStateListener() { @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { super.onSignalStrengthsChanged(signalStrength); // 获取GSM信号强度(范围:0-31,数值越大信号越强;99表示无信号) int gsmRssi = signalStrength.getGsmSignalStrength(); if (gsmRssi != 99) { // 转换为dBm单位:dBm = -113 + 2 * gsmRssi int dBm = -113 + 2 * gsmRssi; // 映射为参考辐射等级(仅作定性参考,无精确对应关系) String rfLevel = getRfLevelFromDbm(dBm); // 更新UI显示 // rfTextView.setText(String.format("蜂窝RF参考水平:%s(%d dBm)", rfLevel, dBm)); } } }; } // 根据dBm值映射辐射参考等级 private String getRfLevelFromDbm(int dBm) { if (dBm >= -50) return "极高"; else if (dBm >= -70) return "高"; else if (dBm >= -90) return "中等"; else return "低"; } @Override protected void onResume() { super.onResume(); // ... 原有磁场传感器注册代码 ... // Android 6.0+ 动态申请权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 1001); } } @Override protected void onPause() { super.onPause(); // ... 原有磁场传感器注销代码 ... telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1001 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); } }
方案2:读取WiFi信号强度
步骤1:申请权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
步骤2:代码实现
private WifiManager wifiManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_non_ionizing_radiation); // ... 原有代码 ... wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); } // 定时获取WiFi信号强度(比如每2秒执行一次) private void getWifiRssi() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_WIFI_STATE) == PackageManager.PERMISSION_GRANTED) { WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int rssi = wifiInfo.getRssi(); // 单位:dBm,范围通常在-30(极强)到-90(极弱)之间 String wifiRfLevel = getRfLevelFromDbm(rssi); // 更新UI // wifiRfTextView.setText(String.format("WiFi RF参考水平:%s(%d dBm)", wifiRfLevel, rssi)); } }
三、注意事项
- 所有基于信号强度的RF估算都是定性参考值,无法替代专业RF测量设备,手机硬件差异、环境干扰都会影响结果;
- 部分安卓机型对信号强度读取有限制,可能无法获取有效数据;
- 可将磁场测量数据与RF参考值结合展示,模拟同类应用的综合检测功能。
内容的提问来源于stack exchange,提问作者SuhailHasan
相关产品推荐
相关产品推荐

