检测位置应用程序崩溃的一些问题

时间:2013-09-11 04:03:53

标签: android google-maps location locationmanager

我正在尝试开发我正在尝试检测位置的小应用程序。

我使用以下代码,但我不知道为什么我的应用程序崩溃。它显示应用程序停止不幸。

这是代码。请告诉我是否有任何错误,如果没有,请至少回复。

感谢。

这是守则。

package com.project.kamani.nearby;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.app.Activity;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class Map extends Activity implements LocationListener{

public GoogleMap google_map;

public List<Address> addresses;

public Geocoder geocoder;

private Location location;

private double lat;
private double lang;

private Criteria criteria;

private LocationManager location_manager;

private String provider;

private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES=20;//DISTANCE IN METERS
private static final long MIN_TIME_BW_UPDATES=1000*60*1;// TAKES UPDATE AFTER 1 MINUTES

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(isGooglePlayAvailable())
    {

        criteria=new Criteria();

        setContentView(R.layout.mapdemo);

        getGoogleMap();

        getUserLocation();

        //Toast.makeText(this, "Latitude:"+lat+" Longitude:"+lang, Toast.LENGTH_LONG).show();

        getAddress(lat,lang);

        drawMarker(lat,lang);

    }

}

private boolean isGooglePlayAvailable(){

    int status=GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

    if(status==ConnectionResult.SUCCESS)
        return true;
    else
        GooglePlayServicesUtil.getErrorDialog(status, this, 10).show();
    return false;

}

private void getGoogleMap(){

    if(google_map==null){

        google_map=((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();

    }

}

private void drawMarker(double lattitude,double longitude){
    google_map.clear();

    google_map.setMyLocationEnabled(true);

    LatLng latlng=new LatLng(lattitude, longitude);

    google_map.moveCamera(CameraUpdateFactory.newLatLng(latlng));
    google_map.animateCamera(CameraUpdateFactory.zoomTo(15));

    LatLng currentPosition = new LatLng(lattitude,longitude);
    google_map.addMarker(new MarkerOptions().position(currentPosition).snippet("Address:" + addresses.get(0).getAddressLine(0) + "City:"+ addresses.get(0).getAddressLine(1)+"Country:"+addresses.get(0).getAddressLine(2)).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)).title("ME"));
}

private void getAddress(double lattitude,double longitude){

    geocoder=new Geocoder(Map.this, Locale.getDefault());

    try {
        addresses=geocoder.getFromLocation(lattitude, longitude, 1);
        Toast.makeText(Map.this, "Address:" + addresses.get(0).getAddressLine(0) + "City:"+ addresses.get(0).getAddressLine(1)+"Country:"+addresses.get(0).getAddressLine(2), Toast.LENGTH_LONG).show();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

private void getUserLocation(){

    location_manager=(LocationManager) getSystemService(LOCATION_SERVICE);
    if(location_manager!=null){
        provider=location_manager.getBestProvider(criteria, true);
        location=location_manager.getLastKnownLocation(provider);
        location_manager.requestLocationUpdates(provider, Map.MIN_TIME_BW_UPDATES, Map.MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
        lat=location.getLatitude();
        lang=location.getLongitude();
    }
}

@Override
public void onLocationChanged(Location location) {

    google_map.clear();

    drawMarker(lat, lang);

}

@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

}

}

以下是我在logcat中获得的错误快照。enter image description here

我希望解决错误会有所帮助。

修改: -

如果您不想再次监控完整代码,只需尝试查看 getUserLocation方法,当我启用GPS时,应用程序仍会停止工作,感谢您的支持。

2 个答案:

答案 0 :(得分:2)

location永远不会被初始化。您将location设置为将保存getUserLocation()的返回值的变量,它也是其参数;两者都是空的。

答案 1 :(得分:0)

public class MainActivity extends MapActivity implements LocationListener {

private MapView mapView;

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

    // Getting reference to MapView
    mapView = (MapView) findViewById(R.id.map_view);

    // Setting Zoom Controls on MapView
    mapView.setBuiltInZoomControls(true);

    // Getting LocationManager object from System Service LOCATION_SERVICE
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    // Creating a criteria object to retrieve provider
    Criteria criteria = new Criteria();

    // Getting the name of the best provider
    String provider = locationManager.getBestProvider(criteria, true);

    // Getting Current Location
    Location location = locationManager.getLastKnownLocation(provider);

    if(location!=null){
        onLocationChanged(location);
    }

    locationManager.requestLocationUpdates(provider, 20000, 0, this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

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

@Override
public void onLocationChanged(Location location) {
    TextView tvLocation = (TextView) findViewById(R.id.tv_location);

    // Getting latitude
    double latitude = location.getLatitude();

    // Getting longitude
    double longitude = location.getLongitude();

    // Setting latitude and longitude in the TextView tv_location
    tvLocation.setText("Latitude:" +  latitude  + ", Longitude:"+ longitude );

    // Creating an instance of GeoPoint corresponding to latitude and longitude
    GeoPoint point = new GeoPoint((int)(latitude * 1E6), (int)(longitude*1E6));

    // Getting MapController
    MapController mapController = mapView.getController();

    // Locating the Geographical point in the Map
    mapController.animateTo(point);

    // Applying a zoom
    mapController.setZoom(15);

    // Redraw the map
    mapView.invalidate();

    // Getting list of overlays available in the map
    List<Overlay> mapOverlays = mapView.getOverlays();

    // Creating a drawable object to represent the image of mark in the map
    Drawable drawable = this.getResources().getDrawable(R.drawable.cur_position);

    // Creating an instance of ItemizedOverlay to mark the current location in the map
    CurrentLocationOverlay currentLocationOverlay = new CurrentLocationOverlay(drawable);

    // Creating an item to represent a mark in the overlay
    OverlayItem currentLocation = new OverlayItem(point, "Current Location", "Latitude : " + latitude + ", Longitude:" + longitude);

    // Adding the mark to the overlay
    currentLocationOverlay.addOverlay(currentLocation);

    // Clear Existing overlays in the map
    mapOverlays.clear();

    // Adding new overlay to map overlay
    mapOverlays.add(currentLocationOverlay);

}

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

Download Here