-1

私は場所を検出しようとしている小さなアプリケーションを開発しようとしています。

次のコードを使用していますが、アプリケーションがクラッシュする理由がわかりません。アプリケーションが残念ながら停止したことを示しています。

これがコードです。バグがあるかどうか教えてください。そうでない場合は、少なくとも返信してください。

ありがとう。

これがコードです。

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 でエラーが発生しているスナップショットです。ここに画像の説明を入力

エラーの解決に役立つことを願っています。

編集:-

もう一度完全なコードを監視したくない場合は、getUserLocation メソッドで表示しようとしても、GPS を有効にするとアプリケーションが動作しなくなります。サポートに感謝します。

4

2 に答える 2

2

location初期化されることはありません。locationの戻り値を保持する変数として設定してgetUserLocation()おり、それはそのパラメーターでもあります。どちらもヌルです。

于 2013-09-11T04:11:15.330 に答える