如何使用FusedLocationProviderClient获取当前位置

问题描述

我试图在片段中使用FusedLocationProviderClient获取设备的当前位置。如果他们接受许可,我希望用户看到当前设备的位置。 问题出在getDeviceLocation()中,该设备检查获取位置是否成功。 logcat不会显示任何错误

这是Java代码

public class DirectionsFragment extends Fragment implements OnMapReadyCallback  {

    GoogleMap mMap;
    Boolean mLocationPermissionGranted=false;
    public String TAG="DirectionsFragment";
    private static final String FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
    private static final String COARSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
    private static final int LOCATION_PERMISSION_CODE = 1234;
    private FusedLocationProviderClient mFusedLocationProviderClient;
    static final float DEFAULT_ZOOM = 15f;
    private Context mContext=getContext();
  OnMapReadyCallback callback=new OnMapReadyCallback() {
      @Override
      public void onMapReady(GoogleMap googleMap) {
          Toast.makeText(getContext(),"Map is Ready",Toast.LENGTH_SHORT).show();
          mMap = googleMap;
          if (mLocationPermissionGranted) {
              getDeviceLocation();
              if (ActivityCompat.checkSelfPermission(mContext,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

                  return;
              }

                  mMap.setMyLocationEnabled(true);
              mMap.getUiSettings().setMyLocationButtonEnabled(true);
              mMap.getUiSettings().setZoomControlsEnabled(true);
              mMap.getUiSettings().setZoomControlsEnabled(true);
          }
      }
  };

    @Override
    public void onViewCreated(@NonNull View view,@Nullable Bundle savedInstanceState) {


        super.onViewCreated(view,savedInstanceState);
        getLocatonPermission();

    }

    private void getDeviceLocation() {

        Log.d(getTag(),"getDeviceLocation:getting device  current location");
        mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(getContext());
        try {
            if (mLocationPermissionGranted=true) {

                if (ActivityCompat.checkSelfPermission(mContext,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    return;
                }
                Task location = mFusedLocationProviderClient.getLastLocation();
                location.addOnCompleteListener(new OnCompleteListener() {
                    @Override
                    public void onComplete(@NonNull Task task) {
                        if (task.isSuccessful()){
                            Log.d(TAG,"onComplete:found Location");
                            Location currentLocation=(Location)task.getResult();
                                moveCamera(new LatLng(currentLocation.getLatitude(),currentLocation.getLongitude()),DEFAULT_ZOOM);
                        }else{
                            Log.d(TAG,"onComplete:current location is null");
                            Toast.makeText(mContext,"unable to get current location",Toast.LENGTH_SHORT).show();

                        }
                    }
                });
            }
        }catch (SecurityException sexc){
            Log.e(TAG,"getDeviceLocation:SecurityException:"+sexc.getMessage());
        }
    }
    //What happens on map zoom
private  void moveCamera(LatLng latLng,float zoom){
Log.d(TAG,"moveCamera:moving the camera to: lat:"+latLng.latitude+","+latLng.longitude);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,zoom));
}

    public  void initMap(){
        SupportMapFragment mapFragment=(SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map);
            if (mapFragment!=null){
                mapFragment.getMapAsync(callback);
            }

    }

    private void getLocatonPermission() {

        String[] permissions={Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION
        } ;
        if (ContextCompat.checkSelfPermission(getContext(),FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

            if (ContextCompat.checkSelfPermission(getContext(),COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                mLocationPermissionGranted = true;
                
                initMap();
            } else {
                ActivityCompat.requestPermissions(getActivity(),permissions,LOCATION_PERMISSION_CODE);
            }
        }  else {
            ActivityCompat.requestPermissions(getActivity(),LOCATION_PERMISSION_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
        mLocationPermissionGranted=false;

        switch (requestCode){

            case LOCATION_PERMISSION_CODE:{
                if (grantResults.length>0){
                    for (int i=0;i<grantResults.length;++i){
                        if (grantResults[i]!=PackageManager.PERMISSION_GRANTED){
                            mLocationPermissionGranted=false;
                            return;
                        }
                    }

                    mLocationPermissionGranted=true;

                    initMap();
                }
            }
        }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {

    }
}

XML代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <fragment
        android:id="@+id/map"
        class="com.google.android.gms.maps.MapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

解决方法

我认为您错过了检查位置提供程序是否已启用的功能:例如GPS:因此,您首先必须检查当前位置提供程序,并且如果该提供程序被禁用,请请求客户允许启用它。这是科特林代码,但我认为您可以弄清楚

function looper(){
If (condition) do something 


   else // loop again 
    } 
looper();