0

私の問題は緯度と経度を取得することです。

エミュレーターで使用するもの:Lat-54.035795、Long-21.760029。しかし、電話をかけるgetLatitude()getLongitude()、54.0と21.0を取得します。
そのため、2点間の正確な距離を取得できません。何が問題ですか?

私を助けてください。

public final class LocationGpsListener implements LocationListener 
{

        private final Context mContext;
        public boolean isGPSEnabled = false;
        boolean isNetworkEnabled = false;
        boolean canGetLocation = false;

        Location location;
        Double latitude;
        Double longitude;

        private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;
        private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1;

        protected LocationManager locationManager;

        public LocationGpsListener(Context context) {
            this.mContext = context;
            getLocation();
        }

        public Location getLocation() {
            try {
                locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
                isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
                Log.v("isGPSEnabled", "=" + isGPSEnabled);

                isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
                Log.v("isNetworkEnabled", "=" + isNetworkEnabled);

                if (isGPSEnabled == false && isNetworkEnabled == false) {

                } else {
                    this.canGetLocation = true;
                    if (isNetworkEnabled) {
                        locationManager.requestLocationUpdates(
                                LocationManager.NETWORK_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        if (locationManager != null) {
                            location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                    if (isGPSEnabled) {
                        if (location == null) {
                            locationManager.requestLocationUpdates(
                                    LocationManager.GPS_PROVIDER,
                                    MIN_TIME_BW_UPDATES,
                                    MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                            Log.d("GPS Enabled", "GPS Enabled");
                            if (locationManager != null) {
                                location = locationManager
                                        .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                                if (location != null) {
                                    latitude = location.getLatitude();
                                    longitude = location.getLongitude();
                                }
                            }
                        }
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

            return location;
        }

        public void stopUsingGPS() {
            if (locationManager != null) {
                locationManager.removeUpdates(LocationGpsListener.this);
            }
        }

        public double getLatitude() {
            if (location != null) {
                latitude = location.getLatitude();
            }
            return latitude;
        }

        public double getLongitude() {
            if (location != null) {
                longitude = location.getLongitude();
            }
            return longitude;
        }

        public boolean canGetLocation() {
            return this.canGetLocation;
        }

        public void showSettingsAlert() {
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

            alertDialog.setTitle("GPS");
            alertDialog.setMessage("GPS is ENABLED:");

            alertDialog.setPositiveButton("Settings",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            Intent intent = new Intent(
                                    Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                            mContext.startActivity(intent);
                        }
                    });

            alertDialog.setNegativeButton("Cancel",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.cancel();
                        }
                    });
            alertDialog.show();
        }

        @Override
        public void onLocationChanged(Location location) {
        }

        @Override
        public void onProviderDisabled(String provider) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }

}

そして私は使用します:

mGPS = new LocationGpsListener(this);

if(mGPS.canGetLocation ){

    longitude = mGPS.getLatitude();
    latitude = mGPS.getLongitude();         
}else{
     longitude = 21.230000;
     latitude = 53.230000;
}

Location l1 = new Location("lok a");
l1.setLatitude(latitude);
l1.setLongitude(longitude);

Location l2 = new Location("lok b");
l2.setLatitude(54.035679);
l2.setLongitude(21.784879);                             
4

3 に答える 3

0

問題は、使用されているロケーションプロバイダーについて十分に具体的ではなく、コースの精度が戻っていることだと思います。

を使用して最適なロケーションプロバイダーを取得しCriteria、目的の精度を設定します。

locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_HIGH);  
locationManager.getBestProvider(criteria, true);

または、代わりに、requestLocationUpdatesCriteriaをパラメーターとして受け取るオーバーライドを使用します。

"android.permission.ACCESS_FINE_LOCATION"上記を確認し、マニフェストにも入れてください。

于 2013-02-12T10:16:01.797 に答える
0

問題を再現することはできませんが、改善されたバージョンのコードを提供できます。

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

public final class LocationGpsListener implements LocationListener {

    public boolean isGPSEnabled = false;

    private Location location;

    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1;

    protected LocationManager locationManager;

    public LocationGpsListener(Context context) {
        locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        // TODO check is network/gps is enabled and display the system settings
        // see
        // https://github.com/unchiujar/Umbra/blob/master/src/main/java/org/unchiujar/umbra/activities/FogOfExplore.java#L599
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES,
                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

        location = new Location("fake");
        location.setLatitude(0);
        location.setLongitude(0);
    }

    public void stopLocationUpdates() {
        if (locationManager != null) {
            locationManager.removeUpdates(LocationGpsListener.this);
        }
    }

    public double getLatitude() {
        return location.getLatitude();
    }

    public double getLongitude() {
        return location.getLongitude();
    }

    @Override
    public void onLocationChanged(Location location) {
        this.location = location;
    }

    @Override
    public void onProviderDisabled(String provider) {
        // NO-OP
    }

    @Override
    public void onProviderEnabled(String provider) {
        // NO-OP
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // NO-OP
    }

}

あなたが投稿したコードは、リスナーパターンを正しく使用していません (私のものもそうではありませんが、改善されています)。場所のロジックは、別の場所onLocationChangedのランダム メソッドではなく、メソッド内にある必要があります。の

読むことをお勧めします: http://www.vogella.com/articles/AndroidLocationAPI/article.html

また、絶対に使用catch(Exception e)しないと、あらゆる種類の非常に追跡が困難なバグにつながります。 ほとんどの場合、Catch(Exception) が悪い考えなのはなぜですか? http://today.java.net/article/2006/04/04/exception-handling-antipatterns#catchingException

于 2013-02-11T13:33:10.477 に答える
0

私の問題は、GPSが適切な値を設定する前に位置情報を取得することでした

そして、私は1つの面白い問題を抱えていました(アプリがクラッシュしたとき):「デバイスにGPSがあるかどうかを確認してください」:)

于 2013-02-12T19:50:25.960 に答える