如何在后台线程中启动 GPS 定位?

Posted

技术标签:

【中文标题】如何在后台线程中启动 GPS 定位?【英文标题】:How to start the GPS positioning in background thread? 【发布时间】:2012-02-04 20:15:27 【问题描述】:

我需要在单独的线程中使用 GPS 检索当前位置。

【问题讨论】:

【参考方案1】:

学习以下代码,

public class LocListener implements LocationListener 
    private static double lat =0.0;
    private static double lon = 0.0;
    private static double alt = 0.0; 
    private static double speed = 0.0;

    public static double getLat()
    
        return lat;
    

    public static double getLon() 
    
        return lon;
    

    public static double getAlt()
    
        return alt;
    

    public static double getSpeed()
    
        return speed;
    

    @Override
    public void onLocationChanged(Location location) 
    
        lat = location.getLatitude();
        lon = location.getLongitude();
        alt = location.getAltitude();
        speed = location.getSpeed(); 
    

    @Override
    public void onProviderDisabled(String provider) 
    @Override
    public void onProviderEnabled(String provider) 
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) 

现在使用此代码在线程中启动 gps。

new Thread ( new Runnable()

     public void run()
     
        locationManager = ( LocationManager ) getSystemService ( Context.LOCATION_SERVICE );
            locationListener = new LocListener();
            locationManager.requestLocationUpdates ( LocationManager.GPS_PROVIDER, 0, 0, locationListener );
     
).start();

【讨论】:

我使用了相同的程序,但出现错误,因为无法在未调用 Looper.prepare() 的线程内创建处理程序 嗨,Arjun,我为您修复了一些代码格式 - 除了添加一些空格以使其正确显示之外,我没有做任何事情。【参考方案2】:

GPS 异步工作,您无需在单独的线程中调用,GPS 在获取位置时不会冻结用户界面。最好的是,您可以使用 progressDialog 并在获得职位后关闭 progressDialog。

【讨论】:

【参考方案3】:
private void turnGPSOn()
    String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

    if(!provider.contains("gps")) //if gps is disabled
        final Intent poke = new Intent();
        poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); 
        poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
        poke.setData(Uri.parse("3")); 
        sendBroadcast(poke);
    


private void turnGPSOff()
    String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

    if(provider.contains("gps")) //if gps is enabled
        final Intent poke = new Intent();
        poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
        poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
        poke.setData(Uri.parse("3")); 
        sendBroadcast(poke);
    

【讨论】:

以上是关于如何在后台线程中启动 GPS 定位?的主要内容,如果未能解决你的问题,请参考以下文章

Django:在后台线程中启动一个进程?

Django如何监听启动,开启另外后台线程

如何在Python中退出主线程并使子线程在后台继续运行

PyQT QGraphicScene 在后台线程中移动项目

如何从后台线程 Swift UI GET 请求发布更改

通过访问 UI 线程启动后台任务