🤖 نحوه دریافت و نمایش مکان فعلی کاربر در نقشه Google در Android

بسیاری از برنامه ها برای ارائه خدمات به کاربران خود از مکان استفاده می کنند.

نمونه ها شامل بسیاری از برنامه های تاکسی مانند Uber است.

اگر می خواهید برنامه ای بسازید که از موقعیت مشتری استفاده کند ، شما شانس دارید.

من می خواهم به شما نشان دهم که چگونه مکان فعلی کاربر را پیدا کنید و آن را روی نقشه نمایش دهید.

کد منبع AndroidCurrentUserLocation را در GitHub پیدا کنید -> https://github.com/CodeGenes/AndroidCurrentUserLocation/tree/mastercert19659006 Google Maps API ، به دنبال دستورالعمل های موجود در صفحه آنها.

توسط با فعال کردن کلید و فعال کردن صورتحساب ، باید API نقشه را با هر API اضافی که ممکن است مورد نیاز شما باشد ، مانند Places API فعال کنید.

پروژه خود را در Android Studio ایجاد کنید.

به gradle.properties بروید و در انتهای این خط اضافه کنید ، اطمینان حاصل کنید که کلید API خود را اضافه کنید.

 # تنظیمات سطح پروژه.
# IDE (به عنوان مثال Android Studio) کاربران:
# تنظیمات مرتب شده از طریق IDE * نادیده گرفته می شود *
# تنظیمات مشخص شده در این پرونده.
# برای کسب اطلاعات بیشتر در مورد نحوه پیکربندی بازدید از محیط ساخت خود
# http://www.gradle.org/docs/current/userguide/build_enociation.html
# آرگومان های JVM استفاده شده برای فرآیند Daemon را مشخص می کند.
# تنظیم به ویژه برای تند و تیز کردن تنظیمات حافظه مفید است.
org.gradle.jvmargs = -Xmx1536m
# هنگام پیکربندی ، Gradle در حالت موازی جوجه کشی اجرا خواهد شد.
# این گزینه فقط باید برای پروژه های جداشده استفاده شود. جزئیات بیشتر ، بازدید کنید
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel = true
# ساختار بسته AndroidX برای روشن تر اینکه بسته های موجود در آن به چه صورت واضح تر است
# سیستم عامل Android ، و بسته بندی شده با APK برنامه شما
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX = درست است
# به صورت خودکار کتابخانه های شخص ثالث را به استفاده از AndroidX تبدیل کنید
android.enableJetifer = درست است
# سبک کدلین کد برای این پروژه: "رسمی" یا "منسوخ":
kotlin.code.style = رسمی

ApiKeyMap = "درج کلید نقشه های Google در اینجا" 

پرونده build.gradle (ماژول: برنامه) و این وابستگی ها را باز کنید.

 افزونه را اعمال کنید: 'com.android.application'

اعمال افزونه: 'kotlin-android'

اعمال افزونه: 'kotlin-android-extensions'

اندیشه {
    کامپایلSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig
        برنامه "com.computingforgeeks.trucksend"
        minSdkVersion 16
        targetSdkVersion 29
        نسخه کد 1
        نسخه نام "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes
        اشکال زدایی {
            buildConfigField 'رشته' ، "ApiKeyMap" ، ApiKeyMap
            resing "string" ، "api_key_map" ، ApiKeyMap
        }
        رها کردن
            minifyEnabled false
            proguardFiles getDefaultProguardFile ('proguard-android-optimize.txt') ، 'proguard-rules.pro'

            buildConfigField 'رشته' ، "ApiKeyMap" ، ApiKeyMap
            resing "string" ، "api_key_map" ، ApiKeyMap
        }
    }
}

وابستگی
    اجرای فایلTree (dir: 'libs' ، شامل: ['*.jar'])
    اجرای "org.jetbrains.kotlin: kotlin-stdlib-jdk7: $ kotlin_version"

    اجرای 'androidx.appcompat: appcompat: 1.1.0'
    اجرای 'androidx.core: core-ktx: 1.1.0'
    اجرای 'androidx.constraintlayout: محدودیت برنامه ریزی: 1.1.3'

    اجرای 'com.google.android.material: مواد: 1.0.0'
    اجرای 'com.google.android.gms: play-service-location: 17.0.0'
    اجرای 'com.google.android.gms: play-service-نقشه: 17.0.0'

    اجرای "com.karumi: dexter: 5.0.0"

    اجرای آزمون 'junit: junit: 4.12'
    androidTestImplementation 'androidx.test.ext: junit: 1.1.1'
    androidTestImplementation 'androidx.test.espresso: esspresso-core: 3.2.0'
} 

روی " همگام سازی " در گوشه بالا سمت راست جهت همگام سازی وابستگی کلیک کنید.

مانیفست را باز کنید و موارد زیر را اضافه کنید:

  


    
    

    
        
            
                

                
            
        
        
        
    

 

این فعالیت را باز کنید ، شروع به اضافه کردن توابع لازم:

 خصوصی تأخیر کوتاه مدت googleMap: GoogleMap
لاتینیت خصوصی var و fusedLocationProviderClient: FusedLocationProviderClient

سرگرمی سرگرم کننده onCreate (ذخیره شده InInstation: بسته نرم افزاری؟) {
        super.onCreate (ذخیره شده در واقعیت استات)
        setContentView (R.layout.activity_main)
        setSupportActionBar (نوار ابزار)

        Val MapFragment = پشتیبانیFragmentManager.findFragmentById (R.id.map) به عنوان پشتیبانیMapFragment؟
        نقشهFragment !!. getMapAsync (این)
        fusedLocationProviderClient = FusedLocationProviderClient (این)

    } 

ما نقشه های Google را شروع می کنیم و از FuseLocationProviderClient برای بدست آوردن موقعیت فعلی کاربر یا آخرین مکان شناخته شده استفاده می کنیم.

لطفاً توجه داشته باشید که فعالیت من اکنون رویMapReady () گسترش خواهد یافت.

نقشه های Google آماده نمایش است.

 نادیده گرفتن سرگرمی onMapReady (نقشه: GoogleMap؟) {
    googleMap = نقشه؟ بازگشت
} 

باید برای دسترسی به موقعیت مکانی خود از کاربر بخواهیم.

برای این کار ، از کتابخانه مجوز Dexter استفاده خواهیم کرد.

اول ، ما بررسی می کنیم که آیا کاربر اجازه ارسال نامه داده است.

 سرگرمی خصوصی isPermissionGiven () : بولی {
    بازگرداندن ActivityCompat.checkSelfPermission (این ، مانیفست.permission.ACCESS_FINE_LOCATION) == بسته بندی مدیر برنامه.PERMISSION_GRANTED
} 

اگر مجوز داده نشود ، ما با استفاده از روش GivePermission تماس می گیریم تا درخواست اجازه دهیم.

 private fun GivePermission ()
    Dexter.withActivity (این)
        .WithPermission (مانیفست.permission.ACCESS_FINE_LOCATION)
        .WithListener (این)
        بررسی کنید ()
} 

پس از اعطای مجوز ، با استفاده از FuseLocationProviderClient ، مکان فعلی کاربر یا آخرین مکان شناخته شده را با استفاده از عملکرد getCurrentLocation فراخوانی کنید. 19659029] سرگرمی خصوصی getCurrentLocation ()

        val locationRequest = مکان جستجو ()
        locationRequest.priority = موقعیت مکانی درخواست.PRIORITY_HIGH_ACCURACY
        locationRequest.interval = (10 * 1000) .toLong ()
        locationRequest.fastestInterval = 2000

        val builder = LocationSettingsRequest.Builder ()
        builder.addLocationRequest (مکان درخواست)
        val locationSettingsRequest = builder.build ()

        نتیجه Val = = LocationService.getSettingsClient (این). چک کردن مکان تنظیمات (موقعیت مکانی تنظیمات درخواست)
        result.addOnCompleteListener {کار ->
            سعی کنید {
                پاسخ val = = task.getResult (ApiException :: class.java)
                اگر (پاسخ !!. locationSettingsStates.isLocationPresent) {
                    getLastLocation ()
                }
            } گرفتن (استثنا: ApiException)
                زمان (استثنا.statusCode) {
                    موقعیت مکانی تنظیمات SportCodes.RESOLUTION_REQUIRED -> سعی کنید {
                        val قابل حل = استثناء به عنوان ResolvableApiException
                        rezvable.startResolutionForResult (این ، REQUEST_CHECK_SETTINGS)
                    } گرفتن (e: IntentSender.SendIntentException) {
                    } گرفتن (e: ClassCastException) {
                    }

                    موقعیت مکانی تنظیمات SportCodes.SETTINGS_CHANGE_UNAVAILABLE -> {}
                }
            }
        }
    }

جایزه Geocoder

به عنوان پاداش ، من روش Gecoder را اضافه کردم تا سعی کنم آدرس این مکان را بدست آورم!

 سرگرمی خصوصی getLastLocation ()
        محل fusedLocationProviderClient.last
            .addOnCompleteListener (این) {کار ->
                if (task.is موفقیت آمیز و & task.result! = null) {
                    val mLastLocation = task.result

                    var آدرس = "آدرس مشخص نیست"

                    val gcd = Geocoder (این ، Locale.getDefault ())
                    آدرس های Val: لیست 
                    سعی کنید {                         آدرس ها = gcd.getFromLocation (mLastLocation !!. عرض جغرافیایی ، mLastLocation. طول ، 1)                         if (آدرس.isNotEmpty ()) {                             آدرس = آدرس [0] .getAddressLine (0)                         }                     } گرفتن (e: IOException) {                         e.printStackTrace ()                     }                     نماد val = BitmapDescriptorFactory.fromBitmap (BitmapFactory.decodeResource (this.resource، R.drawable.ic_pickup))                     googleMap.addMarker (                         MarkerOptions ()                             ترکیب (LatLng (mLastLocation !!. عرض جغرافیایی ، mLastLocation. طول))                             .title ("مکان فعلی")                             .snippet (آدرس)                             آیکون (نماد)                     )                     val cameraPosition = CameraPosition.Builder ()                         .target (LatLng (mLastLocation.latitude ، mLastLocation.langitude))                         .zoom (17f)                         ساخت ()                     googleMap.moveCamera (CameraUpdateFactory.newCameraPosition (دوربین ارائه))                 } دیگه                     Toast.makeText (این ، "مکان فعلی یافت نشد" ، Toast.LENGTH_LONG) .show ()                 }             }     }     نادیده گرفتن سرگرم کننده onActivityResult (درخواست کد: Int ، نتیجه کد: Int ، داده: Intent؟) {         when (درخواست کد)             REQUEST_CHECK_SETTINGS -> {                 if (resultCode == Activity.RESULT_OK)                     getCurrentLocation ()                 }             }         }         super.onActivityResult (درخواست کد ، کد نتیجه ، داده)     }

فعالیت نهایی چنین است:

 بسته com.computingforgeeks.trucksend

واردات android.Manifest
واردات android.app.Activity
واردات android.content.Intent
وارد کردن android.content.IntentSender
وارد کردن android.content.pm.PackageManager
وارد کردن android.graphics.BitmapFective
وارد کردن android.location.Address
واردات android.location.Geocoder
واردات android.os.Bundle
واردات androidx.appcompat.app.AppCompatActivity
وارد کردن android.view.Menu
وارد کردن android.view.MenuItem
وارد کردن android.widget.Toast
وارد کردن androidx.core.app.ActivityCompat
وارد کردن com.google.android.gms.common.api.ApiException
com.google.android.gms.common.api.ResolvableApiException را وارد کنید
com.google.android.gms. محل را وارد کنید. *
com.google.android.gms.maps.CameraUpdateFective را وارد کنید
com.google.android.gms.maps.GoogleMap را وارد کنید
com.google.android.gms.maps.OnMapReadyCallback را وارد کنید
com.google.android.gms.maps.SupportMapFragment را وارد کنید
com.google.android.gms.maps.model.BitmapDescriptorFactions را وارد کنید
com.google.android.gms.maps.model.CameraPosition را وارد کنید
com.google.android.gms.maps.model.LatLng را وارد کنید
واردات com.google.android.gms.maps.model.MarkerOptions
واردات com.karumi.dexter.Dexter
واردات com.karumi.dexter.PermissionToken
واردات com.karumi.dexter.listener.PermissionDeniedResponse
واردات com.karumi.dexter.listener.PermissionGrantedResponse
واردات com.karumi.dexter.listener.PermissionRequest
واردات com.karumi.dexter.listener.single.PermissionListener

واردات kotlinx.android.synthetic.main.activity_main. *
وارد کردن java.io.IOException
وارد کردن java.util. *

کلاس MainActivity: AppCompatActivity () ، OnMapReadyCallback ، PermissionListener

    همراهی {
        const val REQUEST_CHECK_SETTINGS = 43
    }

    خصوصی برای تأخیر واضح و googleMap: GoogleMap
    لاتینیت خصوصی var و fusedLocationProviderClient: FusedLocationProviderClient

    سرپیچی سرگرم کننده onCreate (ذخیره شده InInstState: بسته نرم افزاری؟) {
        super.onCreate (ذخیره شده در واقعیت استات)
        setContentView (R.layout.activity_main)
        setSupportActionBar (نوار ابزار)

        Val MapFragment = پشتیبانیFragmentManager.findFragmentById (R.id.map) به عنوان پشتیبانیMapFragment؟
        نقشهFragment !!. getMapAsync (این)
        fusedLocationProviderClient = FusedLocationProviderClient (این)

    }

    سرگرمی سرگرمی onMapReady (نقشه: GoogleMap؟) {
        googleMap = نقشه؟ بازگشت
        if (isPermissionGiven ())
            googleMap.isMyLocationEnabled = درست است
            googleMap.uiSettings.isMyLocationButtonEnabled = درست است
            googleMap.uiSettings.isZoomControlsEnabled = درست است
            getCurrentLocation ()
        } دیگه
            GivePermission ()
        }
    }

    سرگرمی خصوصی isPermissionGiven (): Boolean {
        بازگرداندن ActivityCompat.checkSelfPermission (این ، مانیفست.permission.ACCESS_FINE_LOCATION) == بسته بندی مدیر برنامه.PERMISSION_GRANTED
    }

    سرگرم کننده خصوصی GivePermission ()
        Dexter.withActivity (این)
            .WithPermission (مانیفست.permission.ACCESS_FINE_LOCATION)
            .WithListener (این)
            بررسی کنید ()
    }

    نادیده گرفتن سرگرم کننده onPermissionGranted (پاسخ: PermissionGrantedResponse؟) {
        getCurrentLocation ()
    }

    نادیده گرفتن سرگرمی onPermissionRationaleShouldBeShown (
        اجازه: PermissionRequest؟
        نشانه: PermissionToken؟
    ) {
        نشانه !!. ادامهPermissionRequest ()
    }

    سرپیچی سرگرم کننده onPermissionDenied (پاسخ: PermissionDeniedResponse؟) {
        Toast.makeText (این ، "مجوز مورد نیاز برای نشان دادن مکان" ، Toast.LENGTH_LONG) .show ()
        پایان ()
    }

    سرگرمی خصوصی getCurrentLocation ()

        val locationRequest = مکان جستجو ()
        locationRequest.priority = موقعیت مکانی درخواست.PRIORITY_HIGH_ACCURACY
        locationRequest.interval = (10 * 1000) .toLong ()
        locationRequest.fastestInterval = 2000

        val builder = LocationSettingsRequest.Builder ()
        builder.addLocationRequest (مکان درخواست)
        val locationSettingsRequest = builder.build ()

        نتیجه Val = = LocationService.getSettingsClient (این). چک کردن مکان تنظیمات (موقعیت مکانی تنظیمات درخواست)
        result.addOnCompleteListener {کار ->
            سعی کنید {
                پاسخ val = = task.getResult (ApiException :: class.java)
                اگر (پاسخ !!. locationSettingsStates.isLocationPresent) {
                    getLastLocation ()
                }
            } گرفتن (استثنا: ApiException)
                زمان (استثنا.statusCode) {
                    موقعیت مکانی تنظیمات SportCodes.RESOLUTION_REQUIRED -> سعی کنید {
                        val قابل حل = استثناء به عنوان ResolvableApiException
                        rezvable.startResolutionForResult (این ، REQUEST_CHECK_SETTINGS)
                    } گرفتن (e: IntentSender.SendIntentException) {
                    } گرفتن (e: ClassCastException) {
                    }

                    موقعیت مکانی تنظیمات SportCodes.SETTINGS_CHANGE_UNAVAILABLE -> {}
                }
            }
        }
    }

    سرگرمی خصوصی getLastLocation ()
        محل fusedLocationProviderClient.last
            .addOnCompleteListener (این) {کار ->
                if (task.is موفقیت آمیز و & task.result! = null) {
                    val mLastLocation = task.result

                    var آدرس = "آدرس مشخص نیست"

                    val gcd = Geocoder (این ، Locale.getDefault ())
                    آدرس های Val: لیست 
                    سعی کنید {                         آدرس ها = gcd.getFromLocation (mLastLocation !!. عرض جغرافیایی ، mLastLocation. طول ، 1)                         if (آدرس.isNotEmpty ()) {                             آدرس = آدرس [0] .getAddressLine (0)                         }                     } گرفتن (e: IOException) {                         e.printStackTrace ()                     }                     نماد val = BitmapDescriptorFactory.fromBitmap (BitmapFactory.decodeResource (this.resource، R.drawable.ic_pickup))                     googleMap.addMarker (                         MarkerOptions ()                             ترکیب (LatLng (mLastLocation !!. عرض جغرافیایی ، mLastLocation. طول))                             .title ("مکان فعلی")                             .snippet (آدرس)                             آیکون (نماد)                     )                     val cameraPosition = CameraPosition.Builder ()                         .target (LatLng (mLastLocation.latitude ، mLastLocation.langitude))                         .zoom (17f)                         ساخت ()                     googleMap.moveCamera (CameraUpdateFactory.newCameraPosition (دوربین ارائه))                 } دیگه                     Toast.makeText (این ، "مکان فعلی یافت نشد" ، Toast.LENGTH_LONG) .show ()                 }             }     }     نادیده گرفتن سرگرم کننده onActivityResult (درخواست کد: Int ، نتیجه کد: Int ، داده: Intent؟) {         when (درخواست کد)             REQUEST_CHECK_SETTINGS -> {                 if (resultCode == Activity.RESULT_OK)                     getCurrentLocation ()                 }             }         }         super.onActivityResult (درخواست کد ، کد نتیجه ، داده)     }     نادیده گرفتن سرگرم کننده onCreateOptionsMenu (منو: منو): بولی {         menuInflater.inflate (R.menu.menu_main ، منو)         بازگشت درست است     }     سرگرمی OnOptionsItemSelected (مورد: منوItem): Boolean B         بازگشت هنگام (item.itemId) return             R.id.action_settings -> true             دیگری -> super.onOptionsItem انتخاب شده (مورد)         }     } }

اکنون برنامه خود را راه اندازی کنید تا موقعیت فعلی خود را ببینید.