To implement OpenStreetMap in Android, you can use the following steps:
- Add the OpenStreetMap library to your project's dependencies. You can do this by adding the following line to your project's build.gradle file:
implementation 'org.osmdroid:osmdroid-android:6.1.14'
- Add the required permissions to your app's AndroidManifest.xml file:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
- Create a layout file for the map view. You can use a RelativeLayout or a FrameLayout to contain the map view. Here's an example layout file:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Activity.MainActivity">
<org.osmdroid.views.MapView
android:id="@+id/osmmap"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
- In your activity, initialize the map view and set its properties. Here's an example code:
import android.app.ProgressDialog
import android.graphics.Rect
import android.location.GpsStatus
import android.location.Location
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.google.android.gms.common.api.GoogleApiClient
import com.google.android.gms.location.LocationRequest
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.SupportMapFragment
import com.google.android.gms.maps.model.*
import com.nic.supperapp.R
import com.nic.supperapp.databinding.ActivityMainBinding
import org.osmdroid.api.IMapController
import org.osmdroid.config.Configuration
import org.osmdroid.events.MapListener
import org.osmdroid.events.ScrollEvent
import org.osmdroid.events.ZoomEvent
import org.osmdroid.tileprovider.tilesource.TileSourceFactory
import org.osmdroid.views.MapView
import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay
class MainActivity : AppCompatActivity(), MapListener, GpsStatus.Listener {
lateinit var mMap: MapView
lateinit var controller: IMapController;
lateinit var mMyLocationOverlay: MyLocationNewOverlay;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
Configuration.getInstance().load(
applicationContext,
getSharedPreferences(getString(R.string.app_name), MODE_PRIVATE)
)
mMap = binding.osmmap
mMap.setTileSource(TileSourceFactory.MAPNIK)
mMap.mapCenter
mMap.setMultiTouchControls(true)
mMap.getLocalVisibleRect(Rect())
mMyLocationOverlay = MyLocationNewOverlay(GpsMyLocationProvider(this), mMap)
controller = mMap.controller
mMyLocationOverlay.enableMyLocation()
mMyLocationOverlay.enableFollowLocation()
mMyLocationOverlay.isDrawAccuracyEnabled = true
mMyLocationOverlay.runOnFirstFix {
runOnUiThread {
controller.setCenter(mMyLocationOverlay.myLocation);
controller.animateTo(mMyLocationOverlay.myLocation)
}
}
// val mapPoint = GeoPoint(latitude, longitude)
controller.setZoom(6.0)
Log.e("TAG", "onCreate:in ${controller.zoomIn()}")
Log.e("TAG", "onCreate: out ${controller.zoomOut()}")
// controller.animateTo(mapPoint)
mMap.overlays.add(mMyLocationOverlay)
mMap.addMapListener(this)
}
override fun onScroll(event: ScrollEvent?): Boolean {
// event?.source?.getMapCenter()
Log.e("TAG", "onCreate:la ${event?.source?.getMapCenter()?.latitude}")
Log.e("TAG", "onCreate:lo ${event?.source?.getMapCenter()?.longitude}")
// Log.e("TAG", "onScroll x: ${event?.x} y: ${event?.y}", )
return true
}
override fun onZoom(event: ZoomEvent?): Boolean {
// event?.zoomLevel?.let { controller.setZoom(it) }
Log.e("TAG", "onZoom zoom level: ${event?.zoomLevel} source: ${event?.source}")
return false;
}
override fun onGpsStatusChanged(event: Int) {
TODO("Not yet implemented")
}
}
- Run the app and you should see a map view centered at the specified location.
Comments
Post a Comment