【发布时间】:2016-08-10 12:49:22
【问题描述】:
我想为 Android 开发一个金属探测器应用程序,为此我将磁力计与 GeomagneticField 本机类一起使用。这就是我正在做的:
- 从磁力计中检索 x、y、z 值并将磁场计算为 x^2 + y^2 + z^2。
- 使用 GeomagneticField 类给出的唯一构造函数计算地磁场。为了计算我的坐标,我使用了位置管理器和与之相关的其他类。
- 比较这些磁场以检测金属。
这是我的代码:
public class MainActivity extends AppCompatActivity implements SensorEventListener, LocationListener {
SensorManager man;
Sensor sensor;
SensorEventListener thisActivity = this;
double earthField;
Location l;
LocationManager locationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
man = (SensorManager) getSystemService(SENSOR_SERVICE);
sensor = man.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
l = getLocation();
if(l != null)
{
GeomagneticField gmf = new GeomagneticField((float) l.getLatitude(),
(float) l.getLongitude(),
(float) l.getAltitude(),
l.getTime());
earthField = getEarthField(gmf);
}
else
{
((TextView)findViewById(R.id.debug)).setText("l è nullo");
}
}
@Override
protected void onPause() {
super.onPause();
man.unregisterListener(this);
}
@Override
protected void onResume() {
super.onResume();
man.registerListener(thisActivity,
sensor,
Sensor.TYPE_MAGNETIC_FIELD,
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
float magneticField = (float) getField(x, y, z);
((TextView) findViewById(R.id.xreading)).setText("X: " + x + "");
((TextView) findViewById(R.id.yreading)).setText("Y: " + y + "");
((TextView) findViewById(R.id.zreading)).setText("Z: " + z + "");
((TextView) findViewById(R.id.earthTxt)).setText("Earth: " + earthField);
((TextView) findViewById(R.id.fieldTxt)).setText("Calculated: " + magneticField);
// I'm not sure i have to repeat this step inside OnSensorChanged.
// Instructions inside the if statement are executed by onCreate, too.
if(l != null)
{
GeomagneticField gmf = new GeomagneticField((float) l.getLatitude(),
(float) l.getLongitude(),
(float) l.getAltitude(),
l.getTime());
earthField = getEarthField(gmf);
}
TextView metalNearby = (TextView) findViewById(R.id.metalNearby);
if (magneticField > 1.4*earthField || magneticField < 0.6*earthField) {
//there is a high probability that some metal is close to the sensor
metalNearby.setText("Ho rilevato un metallo");
}
else {
metalNearby.setText("Sto cercando...");
}
}
private double getEarthField(GeomagneticField gmf) {
return getField(gmf.getX(), gmf.getY(), gmf.getZ());
}
private double getField(float x, float y, float z) {
return Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) { }
public Location getLocation()
{
Location location = null;
try
{
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
// Creating an empty criteria object
Criteria criteria = new Criteria();
// Getting the name of the provider that meets the criteria
String provider = locationManager.getBestProvider(criteria, false);
try
{
location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
catch (SecurityException e)
{
e.printStackTrace();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
return location;
}
}
@Override
public void onLocationChanged(Location location)
{
l = location;
}
我的问题是变量 earthField 总是计算为 0.0,这让我认为 getLocation 方法(用户定义)总是返回 null。 我做错了什么?
【问题讨论】:
标签: android geolocation magnetometer