requestLocationUpdates() 花费太多时间或根本不起作用

Posted

技术标签:

【中文标题】requestLocationUpdates() 花费太多时间或根本不起作用【英文标题】:requestLocationUpdates() takes too much time OR it does not works at all 【发布时间】:2016-09-04 07:26:30 【问题描述】:

我在我的 android 应用程序中使用了 requestLocationUpdates 内的 requestLocationUpdates 方法,以便在我的设备位置发生变化时获取更新。我设置了minTime = 0 但是这个requestLocationUpdates 方法在很长的延迟(即10 到15 分钟,甚至更多)后提供更新。有时当我运行我的应用程序requestLocationUpdates mehod 根本没有提供任何更新。并且很少(非常罕见)这个requestLocationUpdates 方法的行为符合预期(以0 秒的延迟连续提供更新)。那么可能是什么问题?以及如何在每次运行应用程序时持续获取更新?

HelloService.java

public class HelloService extends Service 
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) 
        new Thread(new Runnable() 
            @Override
            public void run() 
                new Handler(getMainLooper()).post(new Runnable() 
                    @Override
                    public void run() 
                        LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                        if (Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(MainActivity.context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(MainActivity.context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
                            return;
                        
                        else 
                            manager.requestLocationUpdates("gps", 0, 0, new LocationDetector());
                            Toast.makeText(MainActivity.ctx, "Service Started...", Toast.LENGTH_LONG).show();
                        
                    
                );
            
        ).start();
        return Service.START_STICKY;
    

LocationDetector.java

public class LocationDetector implements LocationListener     
    @Override
    public void onLocationChanged(Location location) 
        /*I have used here Log.e instead of Log.d in order to get the output in clear red message that is easily readable*/
        Log.e("GPS: ", location.getLatitude()+ ", " +location.getLongitude(), new Exception());
    
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) 
    @Override
    public void onProviderEnabled(String provider) 
    @Override
    public void onProviderDisabled(String provider) 

【问题讨论】:

您请求位置管理器每 0 秒和每 0 米返回您的位置。那么您实际期望的行为是什么? 走出 GPS 实际工作的地方。 这是your previous question 的副本。您现在几乎已经开始向 Stack Overflow 发送垃圾邮件了。 【参考方案1】:

我通过在我的笔记本电脑上创建新项目并在我的手机上运行来尝试你的整个代码。

结果:它工作正常,我的手机上的 GPS TTF 几乎是 15 秒。

您是否尝试过其他设备?

gps 图标呢?出现了,消失了?

并尝试融合位置提供程序,看看会发生什么,link

【讨论】:

每次运行应用程序时,您是否每秒钟都会收到更新? 我正在获取不同时期的位置更新,因为它不能很好地用于像 minTime = 0 和 minDistance = 0 这样的激进使用。 您在执行过程中观察到的两次更新之间的最大延迟是多少? 第一次修复后(15 秒),延迟在 0 - 2000 毫秒之间。 我已经等了 30 分钟,但没有收到任何更新。 gps 图标出现。那么是不是设备的gps有问题?

以上是关于requestLocationUpdates() 花费太多时间或根本不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 requestLocationUpdates 会在接收时立即触发?

如何等待 requestLocationUpdates() 回调意图完成?

当两个 locationManager 对象调用 requestLocationUpdates(...) 时?

requestLocationUpdates 与位置侦听器

没有使用 fusedLocationAPI.requestLocationUpdates 调用 onLocationChanged

onLocationChanged() 永远不会由 requestLocationUpdates() 触发 - Android