Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 不会自动调用onLocationChanged_Android_Geolocation_Gps_Locationmanager_Locationlistener - Fatal编程技术网

Android 不会自动调用onLocationChanged

Android 不会自动调用onLocationChanged,android,geolocation,gps,locationmanager,locationlistener,Android,Geolocation,Gps,Locationmanager,Locationlistener,我对Android中的onLocationChanged事件有问题。以下是触发点: case R.id.start: { Points.add(overlay.getMyLocation()); // Points' type is ArrayList<GeoPoint> mgr.requestLocationUpdates(best, 0, 3, locationListener); } break; 因此,onLocationChanged只调用

我对Android中的onLocationChanged事件有问题。以下是触发点:

case R.id.start: {
    Points.add(overlay.getMyLocation()); // Points' type is ArrayList<GeoPoint>
    mgr.requestLocationUpdates(best, 0, 3, locationListener);
    }
    break;
因此,onLocationChanged只调用一次,并且仅在我按下“开始”后调用。它应该在每次位置改变时自动调用,对吗?就我而言,不是这样。

请帮帮我。

这个问题似乎已经解决了。 在onCreate中,我添加了:

Criteria crit = new Criteria();
crit.setAccuracy(Criteria.ACCURACY_FINE);
best = mgr.getBestProvider(crit, false);
mgr.requestLocationUpdates(best, 0, 1, locationListener);
onLocationChanged现在看起来是这样的:

@Override
public void onLocationChanged(Location location) {
    i++;
    nextPoint = overlay.getMyLocation();
    latitude = nextPoint.getLatitudeE6();
    longtitude = nextPoint.getLongitudeE6();
    lastPoint = new GeoPoint((int) latitude, (int) longtitude);
    Points.add(lastPoint);
    MapOverlay mapOverlay = new MapOverlay(Points.get(i - 1), Points.get(i));
    map.getOverlays().add(mapOverlay);
    mMapController.animateTo(Points.get(i));
    nextPoint = null;
    lastPoint = null;
}
还有,非常重要的方法:

@Override
protected void onResume() {
    super.onResume();
    mgr.requestLocationUpdates(best, 10000, 1, locationListener);
}

@Override
protected void onPause() {
    super.onPause();
    mgr.removeUpdates(locationListener);
}
还有一些新权限:

<uses-permission android:name="android.permission.ACCESS_GPS" />
        <uses-permission android:name="android.permission.ACCESS_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.INTERNET" />


您是否已将使用位置服务的权限添加到清单中,如下所示:
?当然,这是我的权限部分:虽然已经很晚了,但我希望此评论可以帮助其他人,请查看此链接:
如果您使用
访问精细位置
,则无需访问粗略位置。只是想让你知道;)@lomza,有什么区别?@gumuruh,因为
ACCESS\u FINE\u LOCATION
包括WiFi、手机和GPS定位,而
ACCESS\u rough\u LOCATION
仅包括手机和WiFi。所以第一个许可基本上包括第二个。@lomza,这是很好的澄清。谢谢你。我只是从你那里知道的D@RaviVaniya
mgr
是LocationManager,您可以使用
LocationManager=(LocationManager)requireContext()获得它
-
locationListener
是Android
locationListener
接口的实现,
best
是一个
字符串,其中包含最符合您通过的标准的提供商名称。
<uses-permission android:name="android.permission.ACCESS_GPS" />
        <uses-permission android:name="android.permission.ACCESS_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.INTERNET" />