关于gps:Android获取当前位置的最佳方式

Android best way to get current location

本问题已经有最佳答案,请猛点这里访问。

在以下场景中获取android当前位置的最佳方法是什么,

  • 如果GPS不可用,请从网络提供商处获取位置

  • 如果GPS可用并且可以获得当前位置,请从GPS提供商处获取位置

  • 如果GPS可用但无法获得当前位置(即连续搜索位置),请从网络提供商处获取位置。

    现在如果gps不可用,我可以从网络获取位置,我们非常感谢满足上述情况的最佳答案。 提前致谢。


  • 好吧,你可以使用Timer和TimerTask类。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    LocationManager manager;
    TimerTask mTimertask;
    GPSLocationListener mGPSLocationListener;
    int i = 0; //Here i works as counter;
    private static final int MAX_ATTEMPTS = 250;

    public void getCurrentLocation() {
        manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        mGPSLocationListener = new GPSLocationListener();

        manager.addGpsStatusListener(mGPSStatusListener);
        mTimerTask = new LocTimerTask(LocationManager.GPS_PROVIDER);

        if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            Log.v(TAG,"GPS ENABLED");
            manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L,
                    50.0f, mGPSLocationListener);
        } else {
            turnGPSOn();
            manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L,
                    50.0f, mGPSLocationListener);
        }

        if(manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000L,
                    50.0f, mNetworkLocationListener);
        }

        if (manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            Log.v(TAG,"GPS ENABLED");
            manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                    1000L, 50.0f, mGPSLocationListener);
        }

        myLocTimer = new Timer("LocationRunner", true);
        myLocTimer.schedule(mTimerTask, 0, 500);
    }

    GPSStatusListener

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    private GpsStatus.Listener mGPSStatusListener = new GpsStatus.Listener() {

        @Override
        public synchronized void onGpsStatusChanged(int event) {
            switch (event) {
            case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
                Log.v(TAG,"GPS SAtellitestatus");
                GpsStatus status = manager.getGpsStatus(null);
                mSattelites = 0;
                Iterable<GpsSatellite> list = status.getSatellites();
                for (GpsSatellite satellite : list) {
                    if (satellite.usedInFix()) {
                        mSattelites++;
                    }
                }
                break;

            case GpsStatus.GPS_EVENT_FIRST_FIX:
                /*
                 * Toast.makeText(getApplicationContext(),"Got First Fix",
                 * Toast.LENGTH_LONG).show();
                 */
                break;

            case GpsStatus.GPS_EVENT_STARTED:
                /*
                 * Toast.makeText(getApplicationContext(),"GPS Event Started",
                 * Toast.LENGTH_LONG).show();
                 */
                break;

            case GpsStatus.GPS_EVENT_STOPPED:
                /*
                 * Toast.makeText(getApplicationContext(),"GPS Event Stopped",
                 * Toast.LENGTH_LONG).show();
                 */
                break;
            default:
                break;
            }
        }
    };

    LocationListener的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class GPSLocationListener implements LocationListener {

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

        public void onProviderDisabled(String provider) {

        }

        public void onProviderEnabled(String provider) {

        }

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

        }
    }

    TimerTask类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    class LocTimerTask extends TimerTask {
        String provider;

        public LocTimerTask(String provider) {
            this.provider = provider;
        }

        final Handler mHandler = new Handler(Looper.getMainLooper());

        Runnable r = new Runnable() {
            @Override
            public void run() {
                i++;
                Log.v(TAG,"Timer Task run" + i);
                location = manager.getLastKnownLocation(provider);

                if (location != null) {
                    Log.v(TAG,"in timer task run in if location not null");
                    isGPS = true;
                    onLocationReceived(location);
                    myLocTimer.cancel();
                    myLocTimer.purge();
                    mTimerTask.cancel();
                    return;
                } else {
                    Log.v(TAG,"in timer task run in else location null");
                    isGPS = false;
                    if (location == null && i == MAX_ATTEMPTS) {
                        Log.v(TAG,"if 1 max attempts done");
                        turnGPSOff();
                        location = manager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            Log.v(TAG,
                                   "if 1 max attempts done Location from network not null");
                            Log.v(TAG,
                                   "if 1 max attempts done Location from network not null coordinates not null");
                            onLocationReceived(location);
                            myLocTimer.cancel();
                            myLocTimer.purge();
                            mTimerTask.cancel();
                            return;
                        }
                    } else {
                        return;
                    }
                }
                i = 0;
            }
        };

        public void run() {
            mHandler.post(r);
        }
    }

    这里计时器已经安排在每500毫秒运行一次。意味着,每500毫秒执行一次计时器任务的run method。在运行方法尝试获取GPS提供商的位置特定号码。尝试(此处为MAX_ATTEMPTS)表示5或10.如果它在指定的no内获得位置。然后,如果counter(Here i)值超过MAX_ATTEMPTS,则尝试使用该位置,然后从Network Provider获取位置。在获取位置时,我已将该位置传递给回调方法onLocationReceived(Location mLoc),您可以在其中进一步处理位置数据。以下是使用回调方法的方法:

    倾听者

    1
    2
    public interface OnLocationReceivedListener {
    public void onLocationReceived(Location mLoc); //callback method which will be defined in your class.

    }

    您的类应该实现上面定义的侦听器。在你的班上:

    1
    2
    3
    4
    @Override
    public void onLocationReceived(Location mLoc) {
        //Do your stuff
    }

    希望能帮助到你。如果有人有更好的方法,请告诉我。


    班级成员boolean mIsGpsFix;

    请求Gps位置更新并设置倒数计时器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    mCountDown.start();

    private CountDownTimer mCountDown = new CountDownTimer(time to wait for Gps fix, same as right)
    {

        @Override
        public void onTick(long millisUntilFinished)
        {

        }

        @Override
        public void onFinish()
        {
            // No fix after the desire amount of time collapse
            if (!mIsGpsFix)
            // Register for Network
        }
    };


    1
    If GPS is available and can get current location,

    对于上述问题,您可以尝试这样做..

    使用此功能,您可以获取当前位置的纬度和经度,然后传递该值以获取地图。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    public class MyLocationListener implements LocationListener

    {

    @Override

    public void onLocationChanged(Location loc)

    {

    loc.getLatitude();

    loc.getLongitude();

    String Text ="My current location is:" +

    "Latitud =" + loc.getLatitude() +

    "Longitud =" + loc.getLongitude();

    Toast.makeText( getApplicationContext(),

    Text,

    Toast.LENGTH_SHORT).show();

    }

    @Override

    public void onProviderDisabled(String provider)

    {

    Toast.makeText( getApplicationContext(),

    "Gps Disabled",

    Toast.LENGTH_SHORT ).show();

    }

    @Override

    public void onProviderEnabled(String provider)

    {

    Toast.makeText( getApplicationContext(),

    "Gps Enabled",

    Toast.LENGTH_SHORT).show();

    }

    @Override

    public void onStatusChanged(String provider, int status, Bundle extras)

    {

    }

    }

    }