Skip to content
Snippets Groups Projects
Commit 805bfdf9 authored by Hampus Rosenquist's avatar Hampus Rosenquist
Browse files

Start replacing GMaps with Osmdroid

parent 2c87fa05
No related branches found
No related tags found
No related merge requests found
# Built application files
*.apk
*.aar
*.ap_
*.aab
# Files for the ART/Dalvik VM
*.dex
# Java class files
*.class
# Generated files
bin/
gen/
out/
# Uncomment the following line in case you need and you don't have the release build type files in your app
# release/
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Android Studio Navigation editor temp files
.navigation/
# Android Studio captures folder
captures/
# IntelliJ
*.iml
.idea/
# .idea/workspace.xml
# .idea/tasks.xml
# .idea/gradle.xml
# .idea/assetWizardSettings.xml
# .idea/dictionaries
.idea/libraries
# Android Studio 3 in .gitignore file.
.idea/caches
.idea/modules.xml
# Comment next line if keeping position of elements in Navigation Editor is relevant for you
.idea/navEditor.xml
# Keystore files
# Uncomment the following lines if you do not want to check your keystore files in.
*.jks
*.keystore
# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
.cxx/
# Google Services (e.g. APIs or Firebase)
google-services.json
# Freeline
freeline.py
freeline/
freeline_project_description.json
# fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md
# Version control
vcs.xml
# lint
lint/intermediates/
lint/generated/
lint/outputs/
lint/tmp/
# lint/reports/
# MacOS
.DS_Store
# App Specific cases
app/release/output.json
.idea/codeStyles/
{
"url": "https://floobits.com/hampus/DRIPScanner"
}
\ No newline at end of file
extern
node_modules
tmp
vendor
.idea/workspace.xml
.idea/misc.xml
......@@ -51,6 +51,7 @@ dependencies {
implementation 'com.android.support:support-fragment:' + support_version
implementation 'com.google.android.gms:play-services-maps:17.0.0'
implementation 'com.google.android.gms:play-services-location:17.1.0'
implementation 'org.osmdroid:osmdroid-android:6.1.14'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'org.bouncycastle:bcprov-jdk15to18:1.69'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
......
......@@ -5,6 +5,10 @@
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
......@@ -19,6 +23,7 @@
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:hardwareAccelerated="false"
android:theme="@style/AppTheme"
tools:replace="android:icon"
tools:ignore="GoogleAppIndexingWarning">
......@@ -50,6 +55,6 @@
<!-- </activity> -->
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_key" />
android:value="AIzaSyALqZ0HRS1IiuivBxD6E7sBPSlvdYC_jQs" />
</application>
</manifest>
\ No newline at end of file
/*
* Copyright (C) 2019 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*
*/
package org.dripdronescanner.android.app;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.util.Pair;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.core.content.ContextCompat;
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.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;
import org.dripdronescanner.android.data.AircraftObject;
import org.dripdronescanner.android.data.LocationData;
import org.dripdronescanner.android.data.SystemData;
import org.dripdronescanner.android.data.Util;
import org.dripdronescanner.android.R;
import org.osmdroid.config.Configuration;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.views.MapView;
import java.util.Collection;
import java.util.HashMap;
import java.util.ArrayList;
public class AircraftMapView extends SupportMapFragment implements OnMapReadyCallback, GoogleMap.OnMarkerClickListener {
private static final String TAG = "AircraftMapView";
private GoogleMap googleMap;
private AircraftViewModel model;
private final HashMap<AircraftObject, MapObserver> aircraftObservers = new HashMap<>();
private final Util.DiffObserver<AircraftObject> allAircraftObserver = new Util.DiffObserver<AircraftObject>() {
@Override
public void onAdded(Collection<AircraftObject> added) {
for (AircraftObject aircraftObject : added) {
trackAircraft(aircraftObject);
}
}
@Override
public void onRemoved(Collection<AircraftObject> removed) {
for (AircraftObject aircraftObject : removed) {
stopTrackingAircraft(aircraftObject);
}
}
};
private void trackAircraft(AircraftObject aircraftObject) {
MapObserver observer = new MapObserver(aircraftObject);
aircraftObservers.put(aircraftObject, observer);
}
private void stopTrackingAircraft(AircraftObject aircraftObject) {
MapObserver observer = aircraftObservers.remove(aircraftObject);
if (observer == null) return;
observer.stop();
}
private static final int DESIRED_ZOOM = 17;
private static final int ALLOWED_ZOOM_MARGIN = 2;
private void setupModel() {
if (getActivity() == null)
return;
model = ViewModelProviders.of(getActivity()).get(AircraftViewModel.class);
model.getAllAircraft().observe(getViewLifecycleOwner(), allAircraftObserver);
model.getActiveAircraft().observe(getViewLifecycleOwner(), new Observer<AircraftObject>() {
MapObserver last = null;
@Override
public void onChanged(@Nullable AircraftObject object) {
if (object == null || object.getLocation() == null || googleMap == null)
return;
MapObserver observer = aircraftObservers.get(object);
if (observer == null)
return;
if (object.getLocation().getLatitude() == 0.0 && object.getLocation().getLongitude() == 0.0)
return;
LatLng ll = new LatLng(object.getLocation().getLatitude(), object.getLocation().getLongitude());
Log.i(TAG, "centering on " + object + " at " + ll);
if (last != null && last.marker != null) {
last.marker.setAlpha(0.5f);
if (last.markerPilot != null)
last.markerPilot.setAlpha(0.5f);
}
if (observer.marker != null)
observer.marker.setAlpha(1.0f);
if (observer.markerPilot != null)
observer.markerPilot.setAlpha(1.0f);
last = observer;
CameraPosition position = googleMap.getCameraPosition();
if (position.zoom < DESIRED_ZOOM - ALLOWED_ZOOM_MARGIN || position.zoom > DESIRED_ZOOM + ALLOWED_ZOOM_MARGIN)
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(ll, DESIRED_ZOOM));
else
googleMap.moveCamera(CameraUpdateFactory.newLatLng(ll));
}
});
}
@Override
public boolean onMarkerClick(Marker marker) {
if (marker != null) {
Object tag = marker.getTag();
if (tag instanceof AircraftObject) {
model.setActiveAircraft((AircraftObject) tag);
return true;
}
}
return false;
}
class MapObserver implements Observer<LocationData> {
private Marker marker;
private Marker markerPilot;
private Polyline polyline;
private PolylineOptions polylineOptions;
private final AircraftObject aircraft;
MapObserver(AircraftObject active) {
aircraft = active;
aircraft.location.observe(AircraftMapView.this, this);
aircraft.system.observe(AircraftMapView.this, systemObserver);
polylineOptions = new PolylineOptions()
.color(Color.RED)
.clickable(true);
}
void stop() {
aircraft.location.removeObserver(this);
aircraft.system.removeObserver(systemObserver);
if (marker != null) {
marker.remove();
marker = null;
}
if (markerPilot != null) {
markerPilot.remove();
markerPilot = null;
}
if (polyline != null) {
polyline.remove();
polyline = null;
}
polylineOptions = null;
}
private final Observer<SystemData> systemObserver = new Observer<SystemData>() {
@Override
public void onChanged(@Nullable SystemData ignore) {
SystemData sys = aircraft.getSystem();
if (sys == null || googleMap == null)
return;
// filter out zero data
if (sys.getOperatorLatitude() == 0.0 && sys.getOperatorLongitude() == 0.0)
return;
LatLng latLng = new LatLng(sys.getOperatorLatitude(), sys.getOperatorLongitude());
if (markerPilot == null) {
String id = "ID missing";
if (aircraft.getIdentification() != null)
id = aircraft.getIdentification().getUasIdAsString();
markerPilot = googleMap.addMarker(
new MarkerOptions()
.alpha(0.5f)
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
.position(latLng)
.title("pilot " + id));
markerPilot.setTag(new Pair<>(aircraft, this));
}
markerPilot.setPosition(latLng);
}
};
@Override
public void onChanged(@Nullable LocationData ignore) {
boolean zoom = false;
LocationData loc = aircraft.getLocation();
if (loc == null || googleMap == null || polylineOptions == null)
return;
// filter out zero data
if (loc.getLatitude() == 0.0 && loc.getLongitude() == 0.0)
return;
LatLng latLng = new LatLng(loc.getLatitude(), loc.getLongitude());
if (marker == null) {
String id = "ID missing";
if (aircraft.getIdentification() != null)
id = aircraft.getIdentification().getUasIdAsString();
marker = googleMap.addMarker(
new MarkerOptions()
.alpha(0.5f)
.position(latLng)
.title("aircraft " + id));
marker.setTag(aircraft);
zoom = true;
}
polylineOptions.add(latLng);
if (polyline != null) {
polyline.remove();
polyline = null;
}
polyline = googleMap.addPolyline(polylineOptions);
marker.setPosition(latLng);
if (zoom) {
googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
}
}
}
public class AircraftMapView extends SupportMapFragment implements OnMapReadyCallback {
private final int REQUEST_PERMISSIONS_REQUEST_CODE = 1;
private MapView map = null;
@Override
public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {
......@@ -246,34 +35,84 @@ public class AircraftMapView extends SupportMapFragment implements OnMapReadyCal
}
@Override
public void onActivityCreated(Bundle bundle) {
super.onActivityCreated(bundle);
setupModel();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//handle permissions first, before map is created. not depicted here
//load/initialize the osmdroid configuration, this can be done
Context ctx = getApplicationContext();
Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx));
//setting this before the layout is inflated is a good idea
//it 'should' ensure that the map has a writable location for the map cache, even without permissions
//if no tiles are displayed, you can try overriding the cache path using Configuration.getInstance().setCachePath
//see also StorageUtils
//note, the load method also sets the HTTP User Agent to your application's package name, abusing osm's
//tile servers will get you banned based on this string
//inflate and create the map
setContentView(R.layout.activity_main);
map = (MapView) findViewById(R.id.map_view);
map.setTileSource(TileSourceFactory.MAPNIK);
requestPermissionsIfNecessary(new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}
//arrayOf(
// if you need to show the current location, uncomment the line below
// Manifest.permission.ACCESS_FINE_LOCATION,
// WRITE_EXTERNAL_STORAGE is required in order to show the map
//Manifest.permission.WRITE_EXTERNAL_STORAGE
);
}
@Override
public void onMapReady(GoogleMap googleMap) {
if (getActivity() == null)
return;
public void onResume() {
super.onResume();
//this will refresh the osmdroid configuration on resuming.
//if you make changes to the configuration, use
//SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
//Configuration.getInstance().load(this, PreferenceManager.getDefaultSharedPreferences(this));
map.onResume(); //needed for compass, my location overlays, v6.0.0 and up
}
this.googleMap = googleMap;
@Override
public void onPause() {
super.onPause();
//this will refresh the osmdroid configuration on resuming.
//if you make changes to the configuration, use
//SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
//Configuration.getInstance().save(this, prefs);
map.onPause(); //needed for compass, my location overlays, v6.0.0 and up
}
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling ActivityCompat#requestPermissions
// to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
Log.e("XX", "##################### can't make the right permissions");
return;
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
ArrayList<String> permissionsToRequest = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
permissionsToRequest.add(permissions[i]);
}
if (permissionsToRequest.size() > 0) {
ActivityCompat.requestPermissions(
this,
permissionsToRequest.toArray(new String[0]),
REQUEST_PERMISSIONS_REQUEST_CODE);
}
}
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
googleMap.getUiSettings().setMapToolbarEnabled(false);
googleMap.setMyLocationEnabled(true);
googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
googleMap.setOnMarkerClickListener(this);
private void requestPermissionsIfNecessary(String[] permissions) {
ArrayList<String> permissionsToRequest = new ArrayList<>();
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission)
!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
permissionsToRequest.add(permission);
}
}
if (permissionsToRequest.size() > 0) {
ActivityCompat.requestPermissions(
this,
permissionsToRequest.toArray(new String[0]),
REQUEST_PERMISSIONS_REQUEST_CODE);
}
}
}
}
\ No newline at end of file
/*
* Copyright (C) 2019 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*
*/
package org.dripdronescanner.android.app;
import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
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.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;
import org.dripdronescanner.android.data.AircraftObject;
import org.dripdronescanner.android.data.LocationData;
import org.dripdronescanner.android.data.SystemData;
import org.dripdronescanner.android.data.Util;
import java.util.Collection;
import java.util.HashMap;
public class AircraftMapViewOld extends SupportMapFragment implements OnMapReadyCallback, GoogleMap.OnMarkerClickListener {
private static final String TAG = "AircraftMapView";
private GoogleMap googleMap;
private AircraftViewModel model;
private final HashMap<AircraftObject, MapObserver> aircraftObservers = new HashMap<>();
private final Util.DiffObserver<AircraftObject> allAircraftObserver = new Util.DiffObserver<AircraftObject>() {
@Override
public void onAdded(Collection<AircraftObject> added) {
for (AircraftObject aircraftObject : added) {
trackAircraft(aircraftObject);
}
}
@Override
public void onRemoved(Collection<AircraftObject> removed) {
for (AircraftObject aircraftObject : removed) {
stopTrackingAircraft(aircraftObject);
}
}
};
private void trackAircraft(AircraftObject aircraftObject) {
MapObserver observer = new MapObserver(aircraftObject);
aircraftObservers.put(aircraftObject, observer);
}
private void stopTrackingAircraft(AircraftObject aircraftObject) {
MapObserver observer = aircraftObservers.remove(aircraftObject);
if (observer == null) return;
observer.stop();
}
private static final int DESIRED_ZOOM = 17;
private static final int ALLOWED_ZOOM_MARGIN = 2;
private void setupModel() {
if (getActivity() == null)
return;
model = ViewModelProviders.of(getActivity()).get(AircraftViewModel.class);
model.getAllAircraft().observe(getViewLifecycleOwner(), allAircraftObserver);
model.getActiveAircraft().observe(getViewLifecycleOwner(), new Observer<AircraftObject>() {
MapObserver last = null;
@Override
public void onChanged(@Nullable AircraftObject object) {
if (object == null || object.getLocation() == null || googleMap == null)
return;
MapObserver observer = aircraftObservers.get(object);
if (observer == null)
return;
if (object.getLocation().getLatitude() == 0.0 && object.getLocation().getLongitude() == 0.0)
return;
LatLng ll = new LatLng(object.getLocation().getLatitude(), object.getLocation().getLongitude());
Log.i(TAG, "centering on " + object + " at " + ll);
if (last != null && last.marker != null) {
last.marker.setAlpha(0.5f);
if (last.markerPilot != null)
last.markerPilot.setAlpha(0.5f);
}
if (observer.marker != null)
observer.marker.setAlpha(1.0f);
if (observer.markerPilot != null)
observer.markerPilot.setAlpha(1.0f);
last = observer;
CameraPosition position = googleMap.getCameraPosition();
if (position.zoom < DESIRED_ZOOM - ALLOWED_ZOOM_MARGIN || position.zoom > DESIRED_ZOOM + ALLOWED_ZOOM_MARGIN)
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(ll, DESIRED_ZOOM));
else
googleMap.moveCamera(CameraUpdateFactory.newLatLng(ll));
}
});
}
@Override
public boolean onMarkerClick(Marker marker) {
if (marker != null) {
Object tag = marker.getTag();
if (tag instanceof AircraftObject) {
model.setActiveAircraft((AircraftObject) tag);
return true;
}
}
return false;
}
class MapObserver implements Observer<LocationData> {
private Marker marker;
private Marker markerPilot;
private Polyline polyline;
private PolylineOptions polylineOptions;
private final AircraftObject aircraft;
MapObserver(AircraftObject active) {
aircraft = active;
aircraft.location.observe(AircraftMapViewOld.this, this);
aircraft.system.observe(AircraftMapViewOld.this, systemObserver);
polylineOptions = new PolylineOptions()
.color(Color.RED)
.clickable(true);
}
void stop() {
aircraft.location.removeObserver(this);
aircraft.system.removeObserver(systemObserver);
if (marker != null) {
marker.remove();
marker = null;
}
if (markerPilot != null) {
markerPilot.remove();
markerPilot = null;
}
if (polyline != null) {
polyline.remove();
polyline = null;
}
polylineOptions = null;
}
private final Observer<SystemData> systemObserver = new Observer<SystemData>() {
@Override
public void onChanged(@Nullable SystemData ignore) {
SystemData sys = aircraft.getSystem();
if (sys == null || googleMap == null)
return;
// filter out zero data
if (sys.getOperatorLatitude() == 0.0 && sys.getOperatorLongitude() == 0.0)
return;
LatLng latLng = new LatLng(sys.getOperatorLatitude(), sys.getOperatorLongitude());
if (markerPilot == null) {
String id = "ID missing";
if (aircraft.getIdentification() != null)
id = aircraft.getIdentification().getUasIdAsString();
markerPilot = googleMap.addMarker(
new MarkerOptions()
.alpha(0.5f)
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
.position(latLng)
.title("pilot " + id));
markerPilot.setTag(new Pair<>(aircraft, this));
}
markerPilot.setPosition(latLng);
}
};
@Override
public void onChanged(@Nullable LocationData ignore) {
boolean zoom = false;
LocationData loc = aircraft.getLocation();
if (loc == null || googleMap == null || polylineOptions == null)
return;
// filter out zero data
if (loc.getLatitude() == 0.0 && loc.getLongitude() == 0.0)
return;
LatLng latLng = new LatLng(loc.getLatitude(), loc.getLongitude());
if (marker == null) {
String id = "ID missing";
if (aircraft.getIdentification() != null)
id = aircraft.getIdentification().getUasIdAsString();
marker = googleMap.addMarker(
new MarkerOptions()
.alpha(0.5f)
.position(latLng)
.title("aircraft " + id));
marker.setTag(aircraft);
zoom = true;
}
polylineOptions.add(latLng);
if (polyline != null) {
polyline.remove();
polyline = null;
}
polyline = googleMap.addPolyline(polylineOptions);
marker.setPosition(latLng);
if (zoom) {
googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
}
}
}
@Override
public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {
View view = super.onCreateView(layoutInflater, viewGroup, bundle);
getMapAsync(this);
return view;
}
@Override
public void onActivityCreated(Bundle bundle) {
super.onActivityCreated(bundle);
setupModel();
}
@Override
public void onMapReady(GoogleMap googleMap) {
if (getActivity() == null)
return;
this.googleMap = googleMap;
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling ActivityCompat#requestPermissions
// to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
Log.e("XX", "##################### can't make the right permissions");
return;
}
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
googleMap.getUiSettings().setMapToolbarEnabled(false);
googleMap.setMyLocationEnabled(true);
googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
googleMap.setOnMarkerClickListener(this);
}
}
......@@ -12,13 +12,21 @@
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.gms.maps.MapView
<!--<com.google.android.gms.maps.MapView
android:id="@+id/map_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"></com.google.android.gms.maps.MapView>
app:layout_constraintTop_toTopOf="parent"></com.google.android.gms.maps.MapView>-->
<org.osmdroid.views.MapView
android:id="@+id/map_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment