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

Posted

技术标签:

【中文标题】onLocationChanged() 永远不会由 requestLocationUpdates() 触发 - Android【英文标题】:onLocationChanged() is never trigered by requestLocationUpdate() - Android 【发布时间】:2016-09-03 08:13:21 【问题描述】:

我使用manager.requestLocationUpdates("gps", 1000, 0, new LocationDetector()); 每秒获取更新。但是这个方法永远不会触发onLocationChanged() 方法。我已经多次运行我的应用程序,并且我还尝试等待长达 30 分钟以获取更新,但 android 监视器上没有显示任何更新。我还仔细检查了我设备的 GPS 是否已打开。那么请告诉我可能是什么问题?

代码:

public class LocationDetector implements LocationListener 
    @Override
    public void onLocationChanged(Location location) 
        Log.d("GPS: ", location.getLatitude()+ ", " +location.getLongitude());
    

输出:

【问题讨论】:

onLocationChanged() 函数仅在您的位置更改时被调用。你试过改变你的位置来触发这个吗? 您可以使用genymotion.com 为其提供模拟位置,这样您就不必亲自移动来测试onLocationChanged() 功能 我在requestLocationUpdates()中设置了minimum distance = 0,这意味着即使位置变化为0米,也会在1秒后生成更新。 @Chepe77 你有正确的权限吗?检查这个答案,问题似乎相似:***.com/questions/8447861/… 实际请求位置时的代码在哪里? 【参考方案1】:

这是this question 的副本,也是您提出的要求。在任何情况下,您都可以尝试使用GoogleAPIClient - 像这样:

    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(60000); // update every (1) minutes               
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient,locationRequest, yourLocationDetector );

googleApiClient 的实例化和连接方式如下:

/**
     * Helper method to connect the Google API Client
     */
    private void connectGoogleAPIClient() 
      googleApiClient = new GoogleApiClient.Builder(context)
                                .addApi(LocationServices.API)
                                .addConnectionCallbacks(this)
                                .addOnConnectionFailedListener(this)
                                .build();
      googleApiClient.connect();
    

您还需要确保已添加权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

您的问题可能与one discussed here 有关 - 所以请同时查看那里的选定答案,看看它是否也对您的情况有帮助。

【讨论】:

【参考方案2】:

这是一个典型的位置请求应该是这样的:

注意:我有Activity 作为参数,因为我从活动中调用它。它在我的 util 类中。

public static void getLocation(Activity activity) 
    final LocationListener locationListener = new LocationListener() 
        @Override
        public void onProviderEnabled(String provider) 
            Log.i(TAG, "onProviderEnabled");
        

        @Override
        public void onProviderDisabled(String provider) 
            Log.i(TAG, "onProviderDisabled");
        

        @Override
        public void onLocationChanged(Location location) 
            Log.i(TAG, "onLocationChanged");
        

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) 
            Log.i(TAG, "onStatusChanged");
        
    ;

    final LocationManager locationManager = (LocationManager) appContext.getSystemService(Context.LOCATION_SERVICE);
    final Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    criteria.setCostAllowed(false);
    criteria.setAltitudeRequired(false);
    criteria.setBearingRequired(false);
    criteria.setSpeedRequired(false);

    activity.runOnUiThread(new Runnable() 
        @Override
        public void run() 
            locationManager.requestLocationUpdates(1000, 0, criteria, locationListener, null);
        
    );

编辑: 就像@ishmaelMakitla 说的,

确保拥有以下权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

【讨论】:

以上是关于onLocationChanged() 永远不会由 requestLocationUpdates() 触发 - Android的主要内容,如果未能解决你的问题,请参考以下文章

可以永远不会调用 onLocationChanged 吗?

onLocationChanged 永远不会被调用 Emulator

LocationManager.getLastKnownLocation() 返回 null,并且永远不会调用 onLocationChanged

使用带有 GPS 提供程序的 requestLocationUpdates 永远不会调用 onLocationChanged

Android Google Maps API OnLocationChanged 仅调用一次

android检查位置服务启用播放服务位置api