2011-11-30 23 views
0

我想編寫一個應用程序,通過使用GPS跟蹤人員,以便通過短信向android手機發送座標(經度和緯度),並使座標值顯示準確的位置谷歌地圖。沒有位置變化顯示在地圖上

工作系統分爲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.追蹤類:從短信接收器類帶來的雙倍值顯示谷歌地圖上的位置

這裏是我的代碼:

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

當我收到來自SMS的座標值後,地圖上沒有顯示位置變化顯示。我想這可能是因爲跟蹤類不能引用SMS接收器類的座標值。請給我一些建議,我該怎麼做才能解決這個問題。

回答

1

基本上我不明白你的代碼:我不明白你的SMSReceiver,如果你應該通過短信接收一個新的位置,你應該實現你的SMSReceiver和你的MapActivity之間的連接。

什麼你基本上在這裏做的是設置在您的GPS得到一個新的定位點(當你收到新的SMS它不叫),這就是所謂的功能:

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

而且在onLocationChanged()設置兩個對象爲null並嘗試訪問它們的屬性,這當然會給你一個NullPointerException。

我建議你改變你的SMSReceiver來處理短信接收的聽衆。

+0

謝謝你的建議。 – Zephyr

+0

這有幫助嗎?如果這是您等待的答案,請勾選它 – AsTeR