以下活动代码:
我没有收到任何其他错误。但尚未显示标记或位置。
如果有人可以告诉我我的代码有问题,我将非常高兴。
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;
}
}