Android获取当前位置的最佳方式[重复]

Posted

技术标签:

【中文标题】Android获取当前位置的最佳方式[重复]【英文标题】:Android best way to get current location [duplicate] 【发布时间】:2013-03-17 04:34:11 【问题描述】:

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

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

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

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

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

【问题讨论】:

查看这个库:code.google.com/p/little-fluffy-location-library 您查看过旧帖子 1.***.com/questions/1513485/… 2.***.com/questions/3145089/… 最简单的方法是使用这样的高级库:github.com/delight-im/Android-SimpleLocation 【参考方案1】:

嗯,你可以使用Timer 和TimerTask 类。

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

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

位置监听器

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 类

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。如果它在指定数量内获得位置。如果计数器(Here i)值已超过 MAX_ATTEMPTS,则尝试使用该位置,然后从网络提供商处获取位置。在获取位置时,我已将该位置传递给回调方法onLocationReceived(Location mLoc),您可以在其中进一步处理位置数据。以下是您将如何使用回调方法:

听众

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

你的类应该实现上面定义的监听器。在你的课堂上:

@Override
public void onLocationReceived(Location mLoc) 
    //Do your stuff

希望对您有所帮助。如果有人有更好的方法,请告诉我。

【讨论】:

【参考方案2】:
If GPS is available and can get current location, 

对于上面的问题,你可以这样尝试..

使用这个你可以得到当前位置的纬度和经度,然后传递值来获取地图。

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)








【讨论】:

【参考方案3】:

班级成员boolean mIsGpsFix;

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

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
    
;

【讨论】:

以上是关于Android获取当前位置的最佳方式[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在android中获取当前准确位置的最佳方法是啥?

考虑到电池,Android 在后台重复获取位置的最佳方法

在android的服务中获取重复的当前位置?

使用onRequestPermissionsResult以编程方式获取设备IMEI号码android java的最佳方法[重复]

我对获取当前位置android有问题[重复]

Android API 30 及更高级别在后台获取 GPS 位置的最佳方式