You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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));
    }
}

三、注意事项

  1. 所有基于信号强度的RF估算都是定性参考值,无法替代专业RF测量设备,手机硬件差异、环境干扰都会影响结果;
  2. 部分安卓机型对信号强度读取有限制,可能无法获取有效数据;
  3. 可将磁场测量数据与RF参考值结合展示,模拟同类应用的综合检测功能。

内容的提问来源于stack exchange,提问作者SuhailHasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:17:11