Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Kotlin Discussion :

Application geolocalisation bug


Sujet :

Kotlin

  1. #1
    Futur Membre du Club
    Application geolocalisation bug
    Bonjour,

    Debutant sur Kotlin je vous explique la situation.

    Je suis actuellement en train de développer (pour m'entrainer) une application qui fonctionne ainsi :
    - Page d'accueil : liste de différent types de lieux (ex: Restaurant, Musée, Bar, Supermaché...)
    - Si la personne clique par exemple sur "Restaurant" , elle arrive sur une carte qui selon sa géolocalisation lui propose les restaurants à proximité
    - Et cela doit fonctionner pour chaque type de lieux

    Pour se faire j'ai suivis les tutos sur youtube d'une personne qui fais le même style d'application mais avec un design différent
    (cf - Part 1 mise en place de la google map :
    - Part 2 récupération de notre geolocalisation :
    - Part 3 récupération des lieux à proximité (partie à laquelle je suis actuellement))

    Mon problème est le suivant : j'ai bien réussi a créer la liste de lieux, j'ai bien réussi a récupérer ma géolocalisation. Quand je clique sur un élément de la liste je suis bien renvoyé sur une map avec ma géolocalisation. Mais je n'arrive pas a récupérer les lieux à proximité.

    J'ai mis un log dans mon code et je peux voir quand l'application tourne ceci : "URL_DEBUG: https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=0.0,0.0&radius=10000&type=museum&key=AIzaSyC3WmR6rsB26GfTw0WgGkRMrDRvEXB-Gyw"

    On peut donc voir que le problème vient de la location qui reste toujours à 0.0,0.0

    Voici le code du fichier concerné :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    package com.example.finder
     
    import android.content.pm.PackageManager
    import android.location.Location
    import android.os.Build
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.os.Looper
    import android.util.Log
    import android.widget.Toast
    import androidx.core.app.ActivityCompat
    import androidx.core.content.ContextCompat
    import com.example.finder.Common.Common
    import com.example.finder.Model.MyPlaces
    import com.example.finder.Remote.IGoogleAPIService
    import com.google.android.gms.location.*
     
    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.LatLng
    import com.google.android.gms.maps.model.Marker
    import com.google.android.gms.maps.model.MarkerOptions
    import retrofit2.Call
    import retrofit2.Callback
    import retrofit2.Response
     
    class MapRestaurant : AppCompatActivity(), OnMapReadyCallback {
     
        private lateinit var mMap: GoogleMap
        private var latitude<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />ouble=0.toDouble()
        private var longitude<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />ouble=0.toDouble()
        private lateinit var mLastLocation: Location
        private var mMarker: Marker?=null
     
        companion object { private const val MY_PERMISSION_CODE: Int = 1000 }
     
        //Location
        lateinit var fusedLocationProviderClient: FusedLocationProviderClient
        lateinit var locationRequest: LocationRequest
        lateinit var locationCallback: LocationCallback
     
        lateinit var mService:IGoogleAPIService
     
        internal lateinit var currentPlace:MyPlaces
     
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_map_restaurant)
            // Obtain the SupportMapFragment and get notified when the map is ready to be used.
            val mapFragment = supportFragmentManager
                .findFragmentById(R.id.map) as SupportMapFragment
            mapFragment.getMapAsync(this)
     
            //Init Service
            mService = Common.googleApiService
     
            //Request runtime permission
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            {
                if(checkLocationPermission())
                {
                    buildLocationRequest()
                    buildLocationCallBack()
     
                    fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
                    fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper())
                }
            }
            else
            {
                buildLocationRequest()
                buildLocationCallBack()
     
                fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
                fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper())
            }
     
     
            val placeChoix = intent.getStringExtra("CHOIX")
            when(placeChoix)
            {
                "Restaurants" -> nearByPlace("restaurant")
                "Bars" -> nearByPlace("bar")
                "Musées" -> nearByPlace("museum")
                "SuperMarché" -> nearByPlace("supermarket")
                "Hopital" -> nearByPlace("hospital")
                "Magasins" -> nearByPlace("shopping_mall")
            }
     
        }
     
        private fun nearByPlace(typePlace: String) {
            var url = getUrl(this.latitude, this.longitude, typePlace)
     
            mService.getNearbyPlaces(url)
                .enqueue(object:Callback<MyPlaces>{
                    override fun onFailure(call: Call<MyPlaces>, t: Throwable) {
                        Toast.makeText(baseContext, ""+t.message, Toast.LENGTH_SHORT).show()
                    }
     
                    override fun onResponse(call: Call<MyPlaces>, response: Response<MyPlaces>) {
                        currentPlace = response.body()!!
     
                        if(response.isSuccessful)
                        {
     
                            for(i in 0 until response.body()!!.results!!.size)
                            {
                                val markerOptions=MarkerOptions()
                                val googlePlace = response.body()!!.results!![i]
                                val lat = googlePlace.geometry!!.location!!.lat
                                val lng = googlePlace.geometry!!.location!!.lng
                                val placeName = googlePlace.name
                                val latLng = LatLng(lat, lng)
     
                                markerOptions.position(latLng)
                                markerOptions.title(placeName)
                                markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
                                markerOptions.snippet(i.toString()) //Assign index for marker
     
                                mMap.addMarker(markerOptions) //Add marker to map
     
                                //Move camera
                                mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng))
                                mMap.animateCamera(CameraUpdateFactory.zoomTo(20f))
     
                            }
     
                        }
                    }
     
                })
        }
     
        private fun getUrl(latitude: Double, longitude: Double, typePlace: String): String {
            //Toast.makeText(applicationContext, "latitude: $latitude \n longitude : $longitude", Toast.LENGTH_LONG).show()
            val googlePlaceUrl = StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json")
            googlePlaceUrl.append("?location=$latitude,$longitude")
            googlePlaceUrl.append("&radius=10000") //10 km
            googlePlaceUrl.append("&type=$typePlace")
            googlePlaceUrl.append("&key=AIzaSyC3WmR6rsB26GfTw0WgGkRMrDRvEXB-Gyw")
     
            Log.d("URL_DEBUG", googlePlaceUrl.toString())
            return googlePlaceUrl.toString()
        }
     
        private fun buildLocationCallBack() {
            locationCallback = object : LocationCallback() {
                override fun onLocationResult(p0: LocationResult?) {
                    mLastLocation = p0!!.locations.get(p0.locations.size-1) //get last location
     
                    if(mMarker != null)
                    {
                        mMarker!!.remove()
                    }
     
                    this@MapRestaurant.latitude = mLastLocation.latitude
                    this@MapRestaurant.longitude = mLastLocation.longitude
                    //Toast.makeText(applicationContext, "latitude: $latitude \n longitude : $longitude", Toast.LENGTH_LONG).show()
     
                    val latLng = LatLng(latitude,longitude)
                    val markerOptions = MarkerOptions()
                        .position(latLng)
                        .title("Votre position")
                        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN))
                    mMarker = mMap.addMarker(markerOptions)
     
                    //move camera
                    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng))
                    mMap.animateCamera(CameraUpdateFactory.zoomTo(11f))
                }
            }
        }
     
        private fun buildLocationRequest() {
            locationRequest = LocationRequest()
            locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
            locationRequest.interval = 5000
            locationRequest.fastestInterval = 3000
            locationRequest.smallestDisplacement = 10f
        }
     
        private fun checkLocationPermission(): Boolean {
            if(ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
            {
                if(ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.ACCESS_FINE_LOCATION))
                    ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION), MY_PERMISSION_CODE)
                else
                    ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION), MY_PERMISSION_CODE)
                return false
            }
            else
                return true
        }
     
        //override onRequestPermissionResult
     
        override fun onRequestPermissionsResult(
            requestCode: Int,
            permissions: Array<out String>,
            grantResults: IntArray
        ) {
            when(requestCode)
            {
                MY_PERMISSION_CODE->{
                    if(grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                    {
                        if(ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
                            if(checkLocationPermission())
                            {
                                buildLocationRequest()
                                buildLocationCallBack()
     
                                fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
                                fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper())
     
                                mMap.isMyLocationEnabled=true
                            }
                    }
                    else
                    {
                        Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show()
                    }
                }
            }
        }
     
        override fun onStop() {
            fusedLocationProviderClient.removeLocationUpdates(locationCallback)
            super.onStop()
        }
     
        override fun onMapReady(googleMap: GoogleMap) {
            mMap = googleMap
     
            //Init google play services
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (ContextCompat.checkSelfPermission(
                        this,
                        android.Manifest.permission.ACCESS_FINE_LOCATION
                    ) == PackageManager.PERMISSION_GRANTED
                ) {
                    mMap.isMyLocationEnabled = true
                }
            }
            else
                mMap.isMyLocationEnabled = true
     
            //enabled zoom control
            mMap.uiSettings.isZoomControlsEnabled=true
        }
    }


    Si l'un d'entre vous à la patience de regarder et de me venir en aide je serais très reconnaissant! Merci

  2. #2
    Futur Membre du Club
    Ce que je ne comprend pas c'est que lorsque je fais afficher la latitude et longitude dans la fonction "builLocationCallBack" celle-ci est bonne mais des que je sors de cette fonction la latitude et longitude retourne a chaque fois a 0.0. Ce qui n'st pas logique puisque je fais appel à la fonction "buildLocationCallBack" au début de ma classe et donc la latitude et la longitude devrait être modifier en conséquence dans le reste du code :/

  3. #3
    Futur Membre du Club
    Personne pour m'aider ?