如何在Android Studio地图Fragment中进入页面时优先获取当前位置?
修改MapsFragment实现进入页面优先获取当前位置
要实现进入页面时自动获取并定位到当前位置,需要添加位置权限处理和Fused Location Provider的集成,以下是修改后的完整实现:
核心修改说明
- 新增位置权限申请与校验逻辑
- 集成
FusedLocationProviderClient获取设备当前位置 - 地图加载完成后优先触发位置获取,定位成功后自动将相机移动到当前位置并添加标记
修改后的MapsFragment.java代码
import android.Manifest; import android.content.pm.PackageManager; import android.location.Location; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; import com.google.android.gms.location.FusedLocationProviderClient; import com.google.android.gms.location.LocationServices; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.tasks.OnSuccessListener; public class MapsFragment extends Fragment { private static final String ARG_PARAM1 = "param1"; private static final String ARG_PARAM2 = "param2"; private static final int LOCATION_PERMISSION_REQUEST_CODE = 100; private String mParam1; private String mParam2; private GoogleMap mGoogleMap; private FusedLocationProviderClient mFusedLocationClient; public MapsFragment() { // Required empty public constructor } public static MapsFragment newInstance(String param1, String param2) { MapsFragment fragment = new MapsFragment(); Bundle args = new Bundle(); args.putString(ARG_PARAM1, param1); args.putString(ARG_PARAM2, param2); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } // 初始化位置服务客户端 mFusedLocationClient = LocationServices.getFusedLocationProviderClient(requireActivity()); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_maps, container, false); SupportMapFragment supportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.google_map); supportMapFragment.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { mGoogleMap = googleMap; // 地图加载完成后优先获取当前位置 checkLocationPermission(); // 保留原有的地图点击标记逻辑 googleMap.setOnMapClickListener(latLng -> { MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(latLng); markerOptions.title(latLng.latitude + " : " + latLng.longitude); googleMap.clear(); googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10)); googleMap.addMarker(markerOptions); }); } }); return view; } // 检查并申请位置权限 private void checkLocationPermission() { if (ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE); return; } // 权限已授予,获取当前位置 getCurrentLocation(); } // 获取设备最后已知位置 private void getCurrentLocation() { if (ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } mFusedLocationClient.getLastLocation() .addOnSuccessListener(requireActivity(), location -> { if (location != null) { LatLng currentLatLng = new LatLng(location.getLatitude(), location.getLongitude()); mGoogleMap.clear(); // 添加当前位置标记 mGoogleMap.addMarker(new MarkerOptions() .position(currentLatLng) .title("我的位置")); // 相机移动到当前位置,缩放级别15 mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng, 15)); } }); } // 权限申请结果回调 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { getCurrentLocation(); } } } }
额外配置要求
需要在AndroidManifest.xml中添加位置权限声明:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
内容的提问来源于stack exchange,提问作者FellSachi
相关产品推荐
相关产品推荐

