MapBox [AndroidStudio]返回null而不是位置[具有允许的权限]

时间:2018-07-17 19:28:29

标签: java android location mapbox android-location

以下活动代码:

我没有收到任何其他错误。但尚未显示标记或位置。

如果有人可以告诉我我的代码有问题,我将非常高兴。

public class FragmentMap extends Fragment implements LocationEngineListener, PermissionsListener, LoadingIn, OnMapReadyCallback {

//Some static vars
public static final int MARKER_DIAMETER = 120;
public static final double MAP_BOX_ZOOM = 12;

//Gen
private int shopRange = 5;  //km

//Map from mapBox
private MapView mapView;
private MapboxMap mMapboxMap;
private LocationEngine locationEngine;
private LocationLayerPlugin locationLayerPlugin;
private PermissionsManager permissionsManager;
private Location originLocation;

//firebase
private FirebaseShopDatabaseAdapter mFireAdapter;

public FragmentMap() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    // Inflate the layout for this fragment
    View mView = inflater.inflate(R.layout.fragment_fragment_map, container, false);


    //Initialise mapBox
    Mapbox.getInstance(FragmentMap.this.getContext(), getString(R.string.map_box_accses_key));
    mapView = mView.findViewById(R.id.map_view_fragment_map);
    mapView.onCreate(savedInstanceState);
    mapView.getMapAsync(this);

    mFireAdapter = new FirebaseShopDatabaseAdapter();
    return mView;
}

private void enableLocation()   {
    if(PermissionsManager.areLocationPermissionsGranted(this.getContext())) {
        initializeLocationEngine();
        initializeLocationLayer();
    }   else {
        permissionsManager = new PermissionsManager(this);
        permissionsManager.requestLocationPermissions(this.getActivity());
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    permissionsManager.onRequestPermissionsResult(requestCode,permissions,grantResults);
}

@Override
public void onMapReady(MapboxMap mapboxMap) {
    mMapboxMap = mapboxMap;
    enableLocation();
    addOnClickMarkersListener();
    listAllShopsInRectangle();
}

@SuppressWarnings("MissingPermission")
private void initializeLocationEngine() {
    locationEngine = new LocationEngineProvider(this.getContext()).obtainBestLocationEngineAvailable();
    locationEngine.setPriority(LocationEnginePriority.HIGH_ACCURACY);
    locationEngine.activate();

    Location lastLocation = locationEngine.getLastLocation();
    if(lastLocation != null)    {
        originLocation = lastLocation;
        setCameraPosition(lastLocation);
    }   else {
        locationEngine.addLocationEngineListener(this);
    }
}

@SuppressWarnings("MissingPermission")
private void initializeLocationLayer()  {
    locationLayerPlugin = new LocationLayerPlugin(mapView, mMapboxMap,locationEngine);
    locationLayerPlugin.setLocationLayerEnabled(true);
    locationLayerPlugin.setCameraMode(CameraMode.TRACKING);
    locationLayerPlugin.setRenderMode(RenderMode.NORMAL);
}

private void setCameraPosition(Location location)   {
    mMapboxMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(),location.getLongitude()),FragmentMap.MAP_BOX_ZOOM));
}

private void addOnClickMarkersListener() {
    this.mMapboxMap.setOnMarkerClickListener(new MapboxMap.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(@NonNull Marker marker) {
            Intent intent = new Intent(FragmentMap.this.getContext(), ShopShopActivity.class);
            intent.putExtra(ShopShopActivity.START_WITH_USER_UID, marker.getTitle());
            startActivity(intent);
            return  true;
        }
    });
}

@Override
@SuppressWarnings("MissingPermission")
public void onStart() {
    super.onStart();
    if(locationEngine != null)  locationEngine.requestLocationUpdates();
    if(locationLayerPlugin != null) locationLayerPlugin.onStart();
    mapView.onStart();
}

@Override
public void onResume() {
    super.onResume();
    mapView.onResume();
}

@Override
public void onPause() {
    super.onPause();
    mapView.onPause();
}

@Override
public void onStop() {
    super.onStop();
    if(locationEngine != null)  locationEngine.removeLocationUpdates();
    if(locationLayerPlugin != null) locationLayerPlugin.onStop();
    mapView.onStop();
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    mapView.onLowMemory();
}

@Override
public void onDestroy() {
    super.onDestroy();
    if(locationEngine != null)  locationEngine.deactivate();
    mapView.onDestroy();
}


@Override
@SuppressWarnings("MissingPermission")
public void onConnected() {
    locationEngine.requestLocationUpdates();
}

@Override
public void onLocationChanged(Location location) {
    if(location != null)    {
        originLocation = location;
        setCameraPosition(location);
        listAllShopsInRectangle();
    }
}

@Override
public void onExplanationNeeded(List<String> permissionsToExplain) {
    //To explain wy need access
}

@Override
public void onPermissionResult(boolean granted) {
    if(granted) {
        enableLocation();
    }
}

private void listAllShopsInRectangle() {
    if(originLocation == null)  return;

    double myLocLong = originLocation.getLongitude();
    double myLocLati = originLocation.getLatitude();

    double queryLongMin = myLocLong - Collection.getKmGeo(myLocLati, shopRange);
    double queryLongMax = myLocLong + Collection.getKmGeo(myLocLati, shopRange);

    final double queryLatMin = myLocLati - Collection.getKmGeo(myLocLong, shopRange);
    final double queryLatMax = myLocLati + Collection.getKmGeo(myLocLong, shopRange);

    DatabaseReference queryRef = FirebaseDatabase.getInstance().getReference().child(FirebaseDatabaseStructure.Users.Users);
    queryRef.orderByChild(FirebaseDatabaseStructure.Users.User.locationLongitude).startAt(queryLongMin).endAt(queryLongMax).addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            useIndividualSnap(dataSnapshot);
        }

        private void useIndividualSnap(DataSnapshot individualSnap) {
            if (mFireAdapter.userUID.contains(individualSnap.getKey())) return;

            Object shortLatO = individualSnap.child(FirebaseDatabaseStructure.Users.User.locationLatitude).getValue();
            if (shortLatO == null) return;
            double individalLat = (double) shortLatO;

            if (individalLat > queryLatMax || individalLat < queryLatMin) return;


            new FirebaseShopDatabaseAdapter(individualSnap.getKey(), FragmentMap.this);
            //Don't need more here because userUID ist stored in marker itself
        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

}

private void addMarkerToMap(FirebaseShopDatabaseAdapter adapterShop, Icon icon) {
    this.mMapboxMap.addMarker(new MarkerOptions()
            .position(new LatLng(adapterShop.location_lat, adapterShop.location_long))
            .title(adapterShop.userUID))
            .setIcon(icon);
}

//From me [interface]
@Override
public void loadInfoIn() {
    //Never used
}

//From me
@Override
public void keepFresh(final FirebaseShopDatabaseAdapter mfireAdapter) {
    final Context contextForThread = FragmentMap.this.getContext();

    Target target = new Target() {
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            //Setting marker with icon
            addMarkerToMap(mfireAdapter, IconFactory.getInstance(contextForThread).fromBitmap(createBeautifulIconForMaker(bitmap)));
        }

        @Override
        public void onBitmapFailed(Exception e, Drawable errorDrawable) {
            addMarkerToMap(mfireAdapter, null);
        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
        }
    };
    Picasso.get().load(mfireAdapter.imageUri).into(target);
}

private Bitmap createBeautifulIconForMaker(Bitmap bitmap) {
    bitmap = Bitmap.createScaledBitmap(bitmap, FragmentMap.MARKER_DIAMETER, FragmentMap.MARKER_DIAMETER, false);
    bitmap = Collection.getCircularBitmap(FragmentMap.MARKER_DIAMETER,bitmap);
    return bitmap;
}
}

0 个答案:

没有答案