使用Google Maps显示用户当前位置时标记不显示的技术求助
解决Google Maps当前位置标记不显示的问题
我之前做地图应用时也碰到过一模一样的问题,标记死活不出来,后来排查出几个常见的坑,你可以照着一步步检查:
1. 权限没处理到位(最常见的原因)
Android 6.0以后位置权限是危险权限,光在Manifest里加还不够,必须动态申请用户授权:
- 先确认
AndroidManifest.xml里已经加了这两个权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
- 然后在MainActivity里加权限申请的逻辑,比如:
private static final int LOCATION_PERMISSION_REQUEST = 100; private void checkLocationPermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST); } else { // 权限拿到了,去获取位置 fetchCurrentLocation(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == LOCATION_PERMISSION_REQUEST) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { fetchCurrentLocation(); } else { Toast.makeText(this, "不给位置权限的话,没法显示你的位置哦", Toast.LENGTH_SHORT).show(); } } }
2. 位置服务没开
用户的手机可能把GPS/位置服务关了,这时候根本拿不到位置,自然加不了标记。可以加个判断,引导用户开启:
private boolean isLocationServiceEnabled() { LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); }
然后在fetchCurrentLocation开头加:
if (!isLocationServiceEnabled()) { Intent openSettings = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(openSettings); Toast.makeText(this, "先把位置服务打开哈", Toast.LENGTH_SHORT).show(); return; }
3. 标记加早了(地图还没加载好)
一定要等地图初始化完成后再加标记,也就是在onMapReady回调里处理:
private GoogleMap mMap; @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; // 先检查权限,再拿位置加标记 checkLocationPermission(); }
4. 获取位置的逻辑有问题
用FusedLocationProviderClient拿位置时,要处理位置为空的情况(比如刚开机没定位到),还有失败的回调:
private void fetchCurrentLocation() { FusedLocationProviderClient locationClient = LocationServices.getFusedLocationProviderClient(this); locationClient.getLastLocation() .addOnSuccessListener(location -> { if (location != null) { // 拿到位置了,加标记! LatLng myLocation = new LatLng(location.getLatitude(), location.getLongitude()); mMap.addMarker(new MarkerOptions() .position(myLocation) .title("我在这!") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))); // 把地图移到当前位置,缩放级别15刚好 mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myLocation, 15)); } else { Toast.makeText(this, "暂时拿不到位置,试试走动一下或者等几秒", Toast.LENGTH_SHORT).show(); } }) .addOnFailureListener(e -> { Toast.makeText(this, "获取位置出错了:" + e.getMessage(), Toast.LENGTH_SHORT).show(); }); }
你可以照着上面的步骤一步步排查,大概率是权限或者位置服务的问题,先从这两个入手!
内容的提问来源于stack exchange,提问作者Varun MSK
相关产品推荐
相关产品推荐

