【问题标题】:No location changing displayed on the map地图上没有显示位置变化
【发布时间】:2011-11-30 04:45:58
【问题描述】:

我想编写一个使用 GPS 进行人员跟踪的应用程序,以便通过 SMS 将坐标(纬度和经度)发送到 Android 手机,并将坐标值显示在 Google 地图上的准确位置。

工作系统分为2类
1. SMSReceiver 类:接收短信,然后将坐标值字符串值转换为双精度值

这是我的代码:

package com.google.android;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;

public class SMSReceiver extends BroadcastReceiver {

public String slat;
public String slng;
public double dLat;
public double dLng;

public double getLat() {
    return this.dLat;
}

public double getLng() {
    return this.dLng;
}

@Override
public void onReceive(Context context, Intent intent) {
    //---get the SMS message passed in---
    Bundle bundle = intent.getExtras();        
    SmsMessage[] msgs = null;
    String position1 = "";            
    if (bundle != null) {
        //---retrieve the SMS message received---
        Object[] pdus = (Object[]) bundle.get("pdus");
        msgs = new SmsMessage[pdus.length];            
        for (int i=0; i<msgs.length; i++){
            msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);             
            position1 += msgs[i].getMessageBody().toString();       
        }
        String position2 = position1.substring(position1.indexOf(" ")+1, position1.length());
        slat = position1.substring(position1.indexOf(":")+1, position1.indexOf(" "));
        slng = position2.substring(position2.indexOf(":")+1, position2.indexOf(" "));
        dLat = Double.parseDouble(slat);
        dLng = Double.parseDouble(slng);
    }                         
}
}  

2。 Tracking 类:从 SMS 接收器类中获取 double 值以在 Google Map 上显示位置

这是我的代码:

package com.google.android;

import java.io.IOException;
import java.util.List;
import java.util.Locale;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.widget.ZoomControls;

public class TrackingActivity extends MapActivity {
/** Called when the activity is first created. */
private LocationManager locationManager;
private LocationListener locationListener;
private MapView mapView;
private MapController mapController;
private Button btnSatelite;
private Button btnStreet;
private ZoomControls zoomControls;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main2);

    btnSatelite = (Button)findViewById(R.id.btnSatelite);
    btnSatelite.setOnClickListener(new OnClickListener() {
        public void onClick(View arg0) {
        // TODO Auto-generated method stub
                mapView.setTraffic(false);
                mapView.setSatellite(true);
        }
    }
    );

    btnStreet = (Button)findViewById(R.id.btnStreet);
    btnStreet.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
        // TODO Auto-generated method stub
                mapView.setSatellite(false);
                mapView.setTraffic(true);
        }
    }
    );

    zoomControls = (ZoomControls)findViewById(R.id.zoomControls1);
    zoomControls.setOnZoomInClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    mapController.zoomIn();
            }
    });
    zoomControls.setOnZoomOutClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    mapController.zoomOut();
            }
    });

    locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    locationListener = new MyLocationListener();
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locationListener);

    mapView = (MapView)findViewById(R.id.mapview1);
    mapController = mapView.getController();

}

private class MyLocationListener implements LocationListener {

    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub
        SMSReceiver Lat = null;
        SMSReceiver Lng = null;

        /*if (location != null) {
            Toast.makeText(getBaseContext(), "Latitude: " + Lat.getLat() + " Longtitude: " + Lng.getLng(), Toast.LENGTH_SHORT).show();
        }*/

        GeoPoint point = new GeoPoint((int) (Lat.getLat() * 1E6),(int) (Lng.getLng() * 1E6));
        mapController.animateTo(point);
        mapController.setZoom(18);

        ...

        mapView.invalidate();
    }

    ...

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub
    }

    ...

@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
}
}

我收到短信的坐标值后,地图上没有显示位置变化。我想这可能是因为 Tracking 类无法引用 SMS 接收器类的坐标值。请给我一些建议来解决这个问题。

【问题讨论】:

    标签: android


    【解决方案1】:

    基本上我不明白您的代码:我不明白您的 SMSReceiver 的意义,如果您应该通过 SMS 接收新职位,您应该在 SMSReceiver 和 MapActivity 之间实现连接。

    你在这里基本上做的是设置一个函数,当你的 GPS 得到一个新的修复时调用(当你收到一个新的 SMS 时它不会被调用):

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locationListener);
    

    此外,在您的 onLocationChanged() 中,您将两个对象设置为 null 并尝试访问它们的属性,这当然会给您一个 NullPointerException。

    我建议你改变你的 SMSReceiver 来处理 SMS 接收的监听器。

    【讨论】:

    • 感谢您的建议。
    • 这有帮助吗?如果这是您等待的答案,请勾选它
    猜你喜欢
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多