Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Edistynyt mobiiliohjelmointi, 9.2.2023
- OpenWeatherMapin URL-pohja kyselyille:
- // aseta oikeisiin kohtiin latitude, longitude ja oma API key OpenWeatherMapista
- https://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={API key}
- Oletuksena OpenWeatherMap antaa lämpötilat Kelvineinä, muutetaan yksiköt lisäämällä units=metric perään:
- https://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={API key}&units=metric
- // data voisi olla esim tällaista:
- {"coord":{"lon":25.7269,"lat":66.5032},"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04d"}],"base":"stations","main":{"temp":0.67,"feels_like":-5.35,"temp_min":0.67,"temp_max":0.67,"pressure":991,"humidity":93},"visibility":10000,"wind":{"speed":7.72,"deg":230},"clouds":{"all":100},"dt":1675944876,"sys":{"type":1,"id":1354,"country":"FI","sunrise":1675925418,"sunset":1675951944},"timezone":7200,"id":638936,"name":"Rovaniemi","cod":200}
- // tehdään navigationeditorilla CityWeatherFragment, joka ottaa argumenteiksi lat ja long, molemmat tyyppiä Float, ja oletusarvo 0.0
- // tehdään myös siirtymä MapsFragmentista -> CityWeatherFragment
- // kun markeria klikataan, ajetaan tämä funktio:
- override fun onMarkerClick(p0: Marker): Boolean {
- Log.d("ADVTECH", "MARKKERI")
- // markerin koordinaatit
- var coordinates : LatLng = p0.position
- Log.d("ADVTECH", coordinates.latitude.toString() + " - " + coordinates.longitude.toString())
- // markerin mukana tullut lisätieto (tässä tapauksessa kaupungin nimi)
- var city = p0.tag.toString()
- Log.d("ADVTECH", city)
- // siirrytään CityWeatherFragmentiin parametrien kanssa
- val action = MapsFragmentDirections.actionMapsFragmentToCityWeatherFragment(coordinates.latitude.toFloat(), coordinates.longitude.toFloat())
- findNavController().navigate(action)
- return false
- }
- // CityWeatherFragmentin pohja:
- class CityWeatherFragment : Fragment() {
- // change this to match your fragment name
- private var _binding: FragmentCityWeatherBinding? = null
- // This property is only valid between onCreateView and
- // onDestroyView.
- private val binding get() = _binding!!
- val args: CityWeatherFragmentArgs by navArgs()
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View? {
- _binding = FragmentCityWeatherBinding.inflate(inflater, container, false)
- val root: View = binding.root
- // the binding -object allows you to access views in the layout, textviews etc.
- return root
- }
- override fun onDestroyView() {
- super.onDestroyView()
- _binding = null
- }
- }
- // rakennetaan tarvittava URL Volley:tä varten koodissa, esim:
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View? {
- _binding = FragmentCityWeatherBinding.inflate(inflater, container, false)
- val root: View = binding.root
- // the binding -object allows you to access views in the layout, textviews etc.
- // haetaan API key local.properties -tiedostosta
- // tällä tavalla koodissa ei ole oikeita API-key -avaimia näkösällä
- val API_KEY : String = BuildConfig.OPENWEATHER_API_KEY
- val JSON_URL = "https://api.openweathermap.org/data/2.5/weather?lat=${args.lat}&lon=${args.long}&appid=${API_KEY}&units=metric"
- Log.d("ADVTECH", JSON_URL)
- Log.d("ADVTECH", args.lat.toString())
- Log.d("ADVTECH", args.long.toString())
- return root
- }
- // HUOM! Muista myös luoda tarvittavat data classit json2kt.com -palvelussa käyttämällä säätiedotuksen dataa!
- // vinkki: tee omille datatyypeille oma paketti Android-projektiin, esim datatypes, ja sinne jokaiselle datalle oma paketti.
- // esim. datatypes.commen
- // - datatypes.todo
- // datatypes.cityweather
- // jne. tällä tavalla projektin tiedostorakenne on selkeämpi
- // Volley -rakenne, joka hyödyntää aiemmin tehtyä JSON_URL-muuttujaa sekä GSONia
- // sekä aiemmin tehtyä CityWeather-luokkaa (koostuu useasta tiedostosta)
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View? {
- _binding = FragmentCityWeatherBinding.inflate(inflater, container, false)
- val root: View = binding.root
- // the binding -object allows you to access views in the layout, textviews etc.
- // haetaan API key local.properties -tiedostosta
- // tällä tavalla koodissa ei ole oikeita API-key -avaimia näkösällä
- val API_KEY : String = BuildConfig.OPENWEATHER_API_KEY
- val JSON_URL = "https://api.openweathermap.org/data/2.5/weather?lat=${args.lat}&lon=${args.long}&appid=${API_KEY}&units=metric"
- val gson = GsonBuilder().setPrettyPrinting().create()
- // Request a string response from the provided URL.
- val stringRequest: StringRequest = object : StringRequest(
- Request.Method.GET, JSON_URL,
- Response.Listener { response ->
- // print the response as a whole
- // we can use GSON to modify this response into something more usable
- Log.d("ADVTECH", response)
- // muutetaan JSON -> CityWeatheriksi, koska vain yksi objekti JSONissa, käytetään tätä versiota
- var item : CityWeather = gson.fromJson(response, CityWeather::class.java)
- Log.d("ADVTECH", item.main?.temp.toString() + " C")
- // jos käyttöliittymässä olisi esim. TextView tällä id:llä, voimme asettaa
- // nyt helposti siihen dataa, esim. lämpötila
- // binding.textViewCurrentCityTemperature.text = item.main?.temp.toString() + " C"
- },
- Response.ErrorListener {
- // typically this is a connection error
- Log.d("ADVTECH", it.toString())
- })
- {
- @Throws(AuthFailureError::class)
- override fun getHeaders(): Map<String, String> {
- // basic headers for the data
- val headers = HashMap<String, String>()
- headers["Accept"] = "application/json"
- headers["Content-Type"] = "application/json; charset=utf-8"
- return headers
- }
- }
- // Add the request to the RequestQueue. This has to be done in both getting and sending new data.
- // if using this in an activity, use "this" instead of "context"
- val requestQueue = Volley.newRequestQueue(context)
- requestQueue.add(stringRequest)
- return root
- }
- // ---------------------------------------
- // LISÄTEHTÄVÄ: OPENSTREETMAP ANDROIDISSA
- // ---------------------------------------
- // ks. osoite: https://github.com/osmdroid/osmdroid
- // module.gradleen import:
- implementation 'org.osmdroid:osmdroid-android:6.1.14'
- // AndroidManifestiin permissionit:
- <uses-permission android:name="android.permission.INTERNET" />
- <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_NETWORK_STATE" />
- // open street map fragmentin ulkoasu:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <org.osmdroid.views.MapView android:id="@+id/map"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
- </LinearLayout>
- // open street map fragment
- import org.osmdroid.views.MapView
- import androidx.preference.PreferenceManager
- import org.osmdroid.config.Configuration.*
- import org.osmdroid.tileprovider.tilesource.TileSourceFactory
- import org.osmdroid.util.GeoPoint
- import org.osmdroid.views.overlay.Marker
- /**
- * A simple [Fragment] subclass.
- * Use the [OpenStreetMapFragment.newInstance] factory method to
- * create an instance of this fragment.
- */
- class OpenStreetMapFragment : Fragment() {
- // change this to match your fragment name
- private var _binding: FragmentOpenStreetMapBinding? = null
- // This property is only valid between onCreateView and
- // onDestroyView.
- private val binding get() = _binding!!
- // viittaus ulkoasussa olevaan open street mapin MapViewiin
- private lateinit var map : MapView
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View? {
- _binding = FragmentOpenStreetMapBinding.inflate(inflater, container, false)
- val root: View = binding.root
- // HUOM! tämä vaatii module.gradleen importin:
- // implementation 'androidx.preference:preference:1.2.0'
- // ylhäällä pitää olla myös import näin (huomaa: androidx):
- // import androidx.preference.PreferenceManager
- getInstance().load(context, PreferenceManager.getDefaultSharedPreferences(activity as Context))
- // the binding -object allows you to access views in the layout, textviews etc.
- binding.map.setTileSource(TileSourceFactory.MAPNIK)
- // zoomaaminen tiettyyn pisteeseen kartalla
- val mapController = binding.map.controller
- mapController.setZoom(18.0)
- val startPoint = GeoPoint(66.50319436087507, 25.726910828015637)
- mapController.setCenter(startPoint)
- // markerin lisääminen
- var marker : Marker = Marker(binding.map)
- marker.position = startPoint
- marker.title = "Rovaniemi"
- marker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_CENTER)
- binding.map.overlays.add(marker)
- binding.map.invalidate()
- return root
- }
- override fun onDestroyView() {
- super.onDestroyView()
- _binding = null
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement