如何使用 Intentservice 获取位置信息?

Posted

技术标签:

【中文标题】如何使用 Intentservice 获取位置信息?【英文标题】:How to get locationchaged using Intentservice? 【发布时间】:2013-04-23 02:50:11 【问题描述】:

我想在位置更改时获取纬度和经度。如何使用 Intentservice?另一件事是即使应用程序在后台我也想要当前的纬度和经度。

【问题讨论】:

【参考方案1】:

您可以尝试getLastKnownLocation(),但它很可能为空。并且 IntentService 不能等待某个位置修复到达。

相反,您需要一个常规服务来处理这种情况。改用cwac-locpoll

【讨论】:

所以你的意思是,如果我想要连续的位置,我必须使用服务而不是 Intentservice?【参考方案2】:

试试下面的代码,它对我有用以获得坐标

public Location getLocation() 
        try 
            locationManager = (LocationManager) mContext
                    .getSystemService(LOCATION_SERVICE);
        // getting GPS status
        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) 
            // no network provider is enabled
         else 
            this.canGetLocation = true;
            if (isNetworkEnabled) 
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network Enabled");
                if (locationManager != null) 
                    location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) 
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    
                
            
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) 
                if (location == null) 
                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("GPS", "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;

希望对你也有用

【讨论】:

这在IntentService 中无法正常工作,因为在您获得位置修复之前很久,该服务就会被破坏。 @CommonsWare 如何连续使用 IntentService 获取 CurrentLocation?请提供一些指导方针。谢谢 @nitishpatel:我已经对 anilMotwani 的答案投了赞成票,这是正确的答案。【参考方案3】:

您需要在服务中实现 LocationListner。这是一个包含更多信息的链接。 Location Listener in Background Service android 和 Location listener in a service sends notification issue

如果您不想使用服务: BroadcastReceiver for location 您需要实现自定义广播接收器。

【讨论】:

我不想使用服务,因为它会耗尽电池电量。我怎样才能获得与您建议我使用服务相同的结果,但我希望使用 Intentservice 获得相同的结果。是否有可能获得相同的结果如服务所给? 试试这个:***.com/questions/5240246/…【参考方案4】:

如果你真的必须使用 IntentService,你可以实现一个带有适当超时的循环。使用 onLocationChanged 更改一些值。 循环可以每隔一秒测试一次这个值。如果值改变,退出循环,如果达到超时退出循环。 该循环将使 IntentService 保持活动状态,等待 onLocationChanged 触发。

【讨论】:

在这里找到了更好的方法***.com/questions/6866415/… 我试过这个答案,但 onlocationchanged 从未被解雇,但如果你在片段或活动中执行相同的代码,它确实有效,我相信你不能在 IntentService 中使用这个“技巧”。 @angel,使用新线程获取位置,然后使用 thread.join(10000); @angel,使用新线程获取位置,然后使用 thread.join(10000);将当前线程与新线程加入。创建一个回调方法,将在 onlocationchanged 中使用以捕获当前位置属性

以上是关于如何使用 Intentservice 获取位置信息?的主要内容,如果未能解决你的问题,请参考以下文章

未从 IntentService 调用 onLocationChanged

位置侦听器从服务而不是 IntentService 工作

IntentService:如何正确入队?

如何从 IntentService 收集信息并更新 Android UI

使用 IntentService 进行位置监听,但在 onHandleIntent 之后立即调用 onDestroy

如何在 Android 中使用后台服务每 5 分钟获取一次设备位置?