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 永远不会被调用 Emulator
LocationManager.getLastKnownLocation() 返回 null,并且永远不会调用 onLocationChanged
使用带有 GPS 提供程序的 requestLocationUpdates 永远不会调用 onLocationChanged