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

۱. قبل از شروع

اندروید ۱۰ و ۱۱ به کاربران کنترل بیشتری بر دسترسی برنامه‌ها به موقعیت مکانی دستگاهشان می‌دهد.

وقتی یک برنامه در اندروید ۱۱ درخواست دسترسی به موقعیت مکانی می‌کند، کاربران چهار گزینه دارند:

  • اجازه دهید همیشه
  • فقط هنگام استفاده از برنامه مجاز است (در اندروید ۱۰)
  • فقط یک بار (در اندروید ۱۱)
  • انکار

اندروید ۱۰

6a1029175b467c77.png

اندروید ۱۱

73d8cc88c5877c25.png

در این آزمایشگاه کد، شما یاد می‌گیرید که چگونه به‌روزرسانی‌های موقعیت مکانی را دریافت کنید و چگونه از موقعیت مکانی در هر نسخه‌ای از اندروید، به ویژه اندروید ۱۰ و ۱۱، پشتیبانی کنید. در پایان این آزمایشگاه کد، می‌توانید انتظار داشته باشید که برنامه‌ای داشته باشید که از بهترین شیوه‌های فعلی برای بازیابی به‌روزرسانی‌های موقعیت مکانی پیروی می‌کند.

پیش‌نیازها

کاری که انجام خواهید داد

  • بهترین شیوه‌ها را برای مکان‌یابی در اندروید دنبال کنید.
  • مجوزهای موقعیت مکانی پیش‌زمینه را مدیریت کنید (زمانی که کاربر درخواست می‌کند برنامه شما در حین استفاده از برنامه به موقعیت مکانی دستگاه دسترسی داشته باشد).
  • یک برنامه موجود را اصلاح کنید تا با افزودن کدی برای اشتراک و لغو اشتراک در موقعیت مکانی، پشتیبانی از درخواست دسترسی به موقعیت مکانی را اضافه کند.
  • با افزودن منطق دسترسی به موقعیت مکانی در پیش‌زمینه یا هنگام استفاده، پشتیبانی از اندروید ۱۰ و ۱۱ را به برنامه اضافه کنید.

آنچه نیاز دارید

  • اندروید استودیو ۳.۴ یا بالاتر برای اجرای کد
  • یک دستگاه/شبیه‌ساز که پیش‌نمایش توسعه‌دهندگان اندروید ۱۰ و ۱۱ را اجرا می‌کند

۲. شروع کار

مخزن پروژه اولیه را کلون کنید

برای شروع هر چه سریعتر، می‌توانید بر اساس این پروژه اولیه کار خود را شروع کنید. اگر گیت را نصب کرده‌اید، می‌توانید به سادگی دستور زیر را اجرا کنید:

 git clone https://github.com/android/codelab-while-in-use-location

می‌توانید مستقیماً از صفحه گیت‌هاب دیدن کنید.

اگر گیت ندارید، می‌توانید پروژه را به صورت یک فایل زیپ دریافت کنید:

وارد کردن پروژه

اندروید استودیو را باز کنید، از صفحه خوشامدگویی گزینه « باز کردن یک پروژه اندروید استودیو موجود » را انتخاب کنید و پوشه پروژه را باز کنید.

بعد از بارگذاری پروژه، ممکن است هشداری مبنی بر اینکه گیت تمام تغییرات محلی شما را ردیابی نمی‌کند، مشاهده کنید. می‌توانید روی «نادیده گرفتن» کلیک کنید. (هیچ تغییری به مخزن گیت ارسال نخواهد شد.)

در گوشه سمت چپ بالای پنجره پروژه، اگر در نمای اندروید باشید، باید چیزی شبیه به تصویر زیر ببینید. (اگر در نمای پروژه هستید، باید پروژه را گسترش دهید تا همان چیز را ببینید.)

fa825dae96c5dc18.png

دو پوشه وجود دارد ( base و complete ). هر کدام به عنوان یک "ماژول" شناخته می‌شوند.

لطفاً توجه داشته باشید که ممکن است کامپایل پروژه در پس‌زمینه برای اولین بار در اندروید استودیو چند ثانیه طول بکشد. در این مدت، پیام زیر را در نوار وضعیت در پایین اندروید استودیو مشاهده خواهید کرد:

c2273e7835c0841a.png

قبل از ایجاد تغییرات در کد، صبر کنید تا اندروید استودیو ایندکس‌گذاری و ساخت پروژه را تمام کند. این کار به اندروید استودیو اجازه می‌دهد تا تمام اجزای لازم را دریافت کند.

اگر با پیغامی مبنی بر « برای اعمال تغییرات زبان، بارگیری مجدد انجام شود؟» یا چیزی مشابه آن مواجه شدید، گزینه «بله» را انتخاب کنید.

پروژه اولیه را درک کنید

شما تنظیمات را انجام داده‌اید و آماده درخواست موقعیت مکانی در برنامه هستید. از ماژول base به عنوان نقطه شروع استفاده کنید. در هر مرحله، کد را به ماژول base اضافه کنید. زمانی که کار شما با این آزمایشگاه کد تمام شد، کد موجود در ماژول base باید با محتوای ماژول complete مطابقت داشته باشد. ماژول complete می‌تواند برای بررسی کار شما یا برای ارجاع در صورت مواجهه با هرگونه مشکل استفاده شود.

اجزای کلیدی شامل موارد زیر است:

  • MainActivity — رابط کاربری برای کاربر تا به برنامه اجازه دهد به موقعیت مکانی دستگاه دسترسی داشته باشد
  • سرویس LocationService — سرویسی که تغییرات موقعیت مکانی را ثبت و لغو ثبت می‌کند و اگر کاربر از فعالیت برنامه خارج شود، خود را به یک سرویس پیش‌زمینه (با یک اعلان) ارتقا می‌دهد. شما کد موقعیت مکانی را اینجا اضافه می‌کنید.
  • Util — توابع افزونه را برای کلاس Location اضافه می‌کند و مکان را در SharedPreferences (لایه داده ساده‌شده) ذخیره می‌کند.

تنظیمات شبیه ساز

برای اطلاعات بیشتر در مورد راه‌اندازی یک شبیه‌ساز اندروید، به بخش «اجرا روی یک شبیه‌ساز» مراجعه کنید.

اجرای پروژه آغازین

برنامه خود را اجرا کنید.

  1. دستگاه اندروید خود را به رایانه متصل کنید یا یک شبیه‌ساز را اجرا کنید. (مطمئن شوید که دستگاه اندروید ۱۰ یا بالاتر را اجرا می‌کند.)
  2. در نوار ابزار، پیکربندی base را از منوی کشویی انتخاب کرده و روی Run کلیک کنید:

99600e9d44527ab.png

  1. توجه کنید که برنامه زیر روی دستگاه شما ظاهر می‌شود:

99bf1dae46f99af3.png

ممکن است متوجه شوید که هیچ اطلاعات مکانی در صفحه خروجی ظاهر نمی‌شود. به این دلیل است که هنوز کد مکان را اضافه نکرده‌اید.

۳. افزودن موقعیت مکانی

مفاهیم

تمرکز این آزمایشگاه کد، نشان دادن نحوه دریافت به‌روزرسانی‌های موقعیت مکانی و در نهایت پشتیبانی از اندروید ۱۰ و اندروید ۱۱ است.

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

انواع دسترسی به مکان

ممکن است چهار گزینه مختلف برای دسترسی به موقعیت مکانی را از ابتدای codelab به خاطر داشته باشید. نگاهی به معنای آنها بیندازید:

  • فقط هنگام استفاده از برنامه مجاز است
  • این گزینه برای اکثر برنامه‌ها توصیه می‌شود. این گزینه که با نام‌های دسترسی «در حین استفاده» یا «فقط پیش‌زمینه» نیز شناخته می‌شود، در اندروید ۱۰ اضافه شده است و به توسعه‌دهندگان اجازه می‌دهد فقط در زمانی که برنامه به طور فعال در حال استفاده است، موقعیت مکانی را بازیابی کنند. اگر هر یک از موارد زیر صادق باشد، یک برنامه فعال در نظر گرفته می‌شود:
  • یک فعالیت قابل مشاهده است.
  • یک سرویس پیش‌زمینه با یک اعلان مداوم در حال اجرا است.
  • فقط یک بار
  • این قابلیت که در اندروید ۱۱ اضافه شده، همان مجوز فقط هنگام استفاده از برنامه است، اما برای مدت زمان محدودی. برای اطلاعات بیشتر، به مجوزهای یکبار مصرف مراجعه کنید.
  • انکار
  • این گزینه مانع از دسترسی به اطلاعات موقعیت مکانی می‌شود.
  • اجازه دهید همیشه
  • این گزینه امکان دسترسی به موقعیت مکانی را در همه زمان‌ها فراهم می‌کند، اما برای اندروید ۱۰ و بالاتر به مجوز اضافی نیاز دارد . همچنین باید مطمئن شوید که یک مورد استفاده معتبر دارید و با سیاست‌های موقعیت مکانی مطابقت دارید. این گزینه را در این آزمایشگاه کد پوشش نخواهید داد، زیرا یک مورد استفاده نادرتر است. با این حال، اگر یک مورد استفاده معتبر دارید و می‌خواهید نحوه مدیریت صحیح موقعیت مکانی در همه زمان‌ها، از جمله دسترسی به موقعیت مکانی در پس‌زمینه را درک کنید، نمونه LocationUpdatesBackgroundKotlin را بررسی کنید.

سرویس‌ها، سرویس‌های پیش‌زمینه و اتصال

برای پشتیبانی کامل از Allow only هنگام استفاده از به‌روزرسانی‌های موقعیت مکانی برنامه ، باید زمانی را که کاربر از برنامه شما خارج می‌شود، در نظر بگیرید. اگر می‌خواهید در آن شرایط همچنان به‌روزرسانی‌ها را دریافت کنید، باید یک Service پیش‌زمینه ایجاد کنید و آن را با یک Notification مرتبط کنید.

علاوه بر این، اگر می‌خواهید از همان Service برای درخواست به‌روزرسانی موقعیت مکانی، چه زمانی که برنامه شما قابل مشاهده است و چه زمانی که کاربر از برنامه شما خارج می‌شود، استفاده کنید، باید آن Service به عنصر رابط کاربری متصل/غیرمتصل کنید.

از آنجا که این آزمایشگاه کد فقط بر دریافت به‌روزرسانی‌های موقعیت مکانی تمرکز دارد، می‌توانید تمام کدهای مورد نیاز خود را در کلاس ForegroundOnlyLocationService.kt پیدا کنید. می‌توانید در آن کلاس و MainActivity.kt جستجو کنید تا ببینید که چگونه با هم کار می‌کنند.

برای اطلاعات بیشتر، به نمای کلی سرویس‌ها و نمای کلی سرویس‌های محدود مراجعه کنید.

مجوزها

برای دریافت به‌روزرسانی‌های موقعیت مکانی از NETWORK_PROVIDER یا GPS_PROVIDER ، باید با اعلام مجوزهای ACCESS_COARSE_LOCATION یا ACCESS_FINE_LOCATION به ترتیب در فایل مانیفست اندروید خود، از کاربر اجازه بگیرید. بدون این مجوزها، برنامه شما قادر به درخواست دسترسی به موقعیت مکانی در زمان اجرا نخواهد بود.

این مجوزها شامل موارد «فقط یک بار» و «فقط هنگام استفاده از برنامه مجاز است» می‌شوند، زمانی که برنامه شما روی دستگاهی با اندروید ۱۰ یا بالاتر استفاده می‌شود.

مکان

برنامه شما می‌تواند از طریق کلاس‌های موجود در پکیج com.google.android.gms.location به مجموعه سرویس‌های موقعیت مکانی پشتیبانی‌شده دسترسی داشته باشد.

به کلاس‌های اصلی نگاه کنید:

  • FusedLocationProviderClient
  • این جزء اصلی چارچوب مکان است. پس از ایجاد، از آن برای درخواست به‌روزرسانی‌های مکان و دریافت آخرین مکان شناخته‌شده استفاده می‌کنید.
  • LocationRequest
  • این یک شیء داده است که شامل پارامترهای کیفیت سرویس برای درخواست‌ها (فواصل به‌روزرسانی‌ها، اولویت‌ها و دقت) است. این پارامتر هنگام درخواست به‌روزرسانی موقعیت مکانی به FusedLocationProviderClient ارسال می‌شود.
  • LocationCallback
  • این برای دریافت اعلان‌ها زمانی که مکان دستگاه تغییر کرده یا دیگر قابل تعیین نیست، استفاده می‌شود. به این یک LocationResult ارسال می‌شود که می‌توانید Location را برای ذخیره در پایگاه داده خود دریافت کنید.

حالا که یک ایده اولیه از کاری که می‌خواهید انجام دهید دارید، شروع به کدنویسی کنید!

۴. ویژگی‌های مکان را اضافه کنید

این آزمایشگاه کد بر رایج‌ترین گزینه موقعیت مکانی تمرکز دارد: فقط هنگام استفاده از برنامه مجاز باشد .

برای دریافت به‌روزرسانی‌های موقعیت مکانی، برنامه شما باید یا یک اکتیویتی قابل مشاهده داشته باشد یا یک سرویس در پیش‌زمینه (با یک اعلان) در حال اجرا باشد.

مجوزها

هدف این کدلاگ نشان دادن نحوه دریافت به‌روزرسانی‌های موقعیت مکانی است، نه نحوه درخواست مجوزهای موقعیت مکانی، بنابراین کد مبتنی بر مجوز از قبل برای شما نوشته شده است. اگر آن را متوجه شده‌اید، می‌توانید از آن صرف نظر کنید.

موارد زیر نکات برجسته مجوز هستند (برای این بخش نیازی به انجام کاری نیست):

  1. در فایل AndroidManifest.xml مجوز مورد استفاده خود را مشخص کنید.
  2. قبل از تلاش برای دسترسی به اطلاعات موقعیت مکانی، بررسی کنید که آیا کاربر به برنامه شما اجازه انجام این کار را داده است یا خیر. اگر برنامه شما هنوز مجوزی دریافت نکرده است، درخواست دسترسی دهید.
  3. مدیریت انتخاب مجوز کاربر. (می‌توانید این کد را در فایل MainActivity.kt مشاهده کنید.)

اگر TODO: Step 1.0, Review Permissions در AndroidManifest.xml یا MainActivity.kt جستجو کنید، تمام کدهای نوشته شده برای مجوزها را مشاهده خواهید کرد.

برای اطلاعات بیشتر، به نمای کلی مجوزها مراجعه کنید.

حالا، شروع به نوشتن کد مکان کنید.

متغیرهای کلیدی مورد نیاز برای به‌روزرسانی‌های مکان را مرور کنید

در ماژول base ، TODO: Step 1.1, Review variables در

فایل ForegroundOnlyLocationService.kt .

در این مرحله نیازی به انجام هیچ کاری نیست. فقط کافی است بلوک کد زیر را به همراه توضیحات آن بررسی کنید تا کلاس‌ها و متغیرهای کلیدی مورد استفاده برای دریافت به‌روزرسانی‌های موقعیت مکانی را درک کنید.

// TODO: Step 1.1, Review variables (no changes).
// FusedLocationProviderClient - Main class for receiving location updates.
private lateinit var fusedLocationProviderClient: FusedLocationProviderClient

// LocationRequest - Requirements for the location updates, i.e., how often you
// should receive updates, the priority, etc.
private lateinit var locationRequest: LocationRequest

// LocationCallback - Called when FusedLocationProviderClient has a new Location.
private lateinit var locationCallback: LocationCallback

// Used only for local storage of the last known location. Usually, this would be saved to your
// database, but because this is a simplified sample without a full database, we only need the
// last location to create a Notification if the user navigates away from the app.
private var currentLocation: Location? = null

بررسی مقداردهی اولیه FusedLocationProviderClient

در ماژول base ، TODO: Step 1.2, Review the FusedLocationProviderClient در فایل ForegroundOnlyLocationService.kt بررسی کنید. کد شما باید چیزی شبیه به این باشد:

// TODO: Step 1.2, Review the FusedLocationProviderClient.
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)

همانطور که در نظرات قبلی ذکر شد، این کلاس اصلی برای دریافت به‌روزرسانی‌های مکان است. متغیر از قبل برای شما مقداردهی اولیه شده است، اما بررسی کد برای درک نحوه مقداردهی اولیه آن مهم است. بعداً برای درخواست به‌روزرسانی‌های مکان، کدی را به اینجا اضافه می‌کنید.

مقداردهی اولیه درخواست موقعیت مکانی

  1. در ماژول base ، TODO: Step 1.3, Create a LocationRequest در فایل ForegroundOnlyLocationService.kt .
  2. کد زیر را بعد از کامنت اضافه کنید.

کد مقداردهی اولیه LocationRequest پارامترهای اضافی کیفیت سرویس مورد نیاز برای درخواست شما (فواصل زمانی، حداکثر زمان انتظار و اولویت) را اضافه می‌کند.

// TODO: Step 1.3, Create a LocationRequest.
locationRequest = LocationRequest.create().apply {
   // Sets the desired interval for active location updates. This interval is inexact. You
   // may not receive updates at all if no location sources are available, or you may
   // receive them less frequently than requested. You may also receive updates more
   // frequently than requested if other applications are requesting location at a more
   // frequent interval.
   //
   // IMPORTANT NOTE: Apps running on Android 8.0 and higher devices (regardless of
   // targetSdkVersion) may receive updates less frequently than this interval when the app
   // is no longer in the foreground.
   interval = TimeUnit.SECONDS.toMillis(60)

   // Sets the fastest rate for active location updates. This interval is exact, and your
   // application will never receive updates more frequently than this value.
   fastestInterval = TimeUnit.SECONDS.toMillis(30)

   // Sets the maximum time when batched location updates are delivered. Updates may be
   // delivered sooner than this interval.
   maxWaitTime = TimeUnit.MINUTES.toMillis(2)

   priority = LocationRequest.PRIORITY_HIGH_ACCURACY
}
  1. برای درک نحوه عملکرد هر یک، نظرات را بخوانید.

مقداردهی اولیه LocationCallback

  1. در ماژول base ، TODO: Step 1.4, Initialize the LocationCallback در فایل ForegroundOnlyLocationService.kt .
  2. کد زیر را بعد از کامنت اضافه کنید.
// TODO: Step 1.4, Initialize the LocationCallback.
locationCallback = object : LocationCallback() {
    override fun onLocationResult(locationResult: LocationResult) {
        super.onLocationResult(locationResult)

        // Normally, you want to save a new location to a database. We are simplifying
        // things a bit and just saving it as a local variable, as we only need it again
        // if a Notification is created (when the user navigates away from app).
        currentLocation = locationResult.lastLocation

        // Notify our Activity that a new location was added. Again, if this was a
        // production app, the Activity would be listening for changes to a database
        // with new locations, but we are simplifying things a bit to focus on just
        // learning the location side of things.
        val intent = Intent(ACTION_FOREGROUND_ONLY_LOCATION_BROADCAST)
        intent.putExtra(EXTRA_LOCATION, currentLocation)
        LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(intent)

        // Updates notification content if this service is running as a foreground
        // service.
        if (serviceRunningInForeground) {
            notificationManager.notify(
                NOTIFICATION_ID,
                generateNotification(currentLocation))
        }
    }
}

LocationCallback که در اینجا ایجاد می‌کنید، فراخوانی است که FusedLocationProviderClient هنگام به‌روزرسانی جدید مکان، آن را فراخوانی می‌کند.

در فراخوانی خود، ابتدا آخرین موقعیت مکانی را با استفاده از شیء LocationResult دریافت می‌کنید. پس از آن، Activity خود را با استفاده از یک پخش محلی (در صورت فعال بودن) از موقعیت مکانی جدید مطلع می‌کنید یا اگر این سرویس به عنوان یک Service پیش‌زمینه در حال اجرا است، Notification به‌روزرسانی می‌کنید.

  1. برای فهمیدن اینکه هر بخش چه کاری انجام می‌دهد، نظرات را بخوانید.

اشتراک در تغییرات مکان

حالا که همه چیز را مقداردهی اولیه کردید، باید به FusedLocationProviderClient اطلاع دهید که می‌خواهید به‌روزرسانی‌ها را دریافت کنید.

  1. در ماژول base ، در فایل ForegroundOnlyLocationService.kt به دنبال Step 1.5, Subscribe to location changes بگردید.
  2. کد زیر را بعد از کامنت اضافه کنید.
// TODO: Step 1.5, Subscribe to location changes.
fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())

فراخوانی requestLocationUpdates() به FusedLocationProviderClient اطلاع می‌دهد که شما می‌خواهید به‌روزرسانی‌های موقعیت مکانی را دریافت کنید.

احتمالاً LocationRequest و LocationCallback که قبلاً تعریف کردید، می‌شناسید. این دو به FusedLocationProviderClient اجازه می‌دهند پارامترهای کیفیت سرویس را برای درخواست شما و آنچه را که هنگام به‌روزرسانی باید فراخوانی کند، بداند. در نهایت، شیء Looper نخ مربوط به فراخوانی را مشخص می‌کند.

همچنین ممکن است متوجه شده باشید که این کد درون یک دستور try/catch قرار دارد. این متد به چنین بلوکی نیاز دارد زیرا یک SecurityException زمانی رخ می‌دهد که برنامه شما اجازه دسترسی به اطلاعات موقعیت مکانی را نداشته باشد.

لغو اشتراک از تغییرات مکان

وقتی برنامه دیگر نیازی به دسترسی به اطلاعات موقعیت مکانی ندارد، لغو اشتراک از به‌روزرسانی‌های موقعیت مکانی مهم است.

  1. در ماژول base ، در فایل ForegroundOnlyLocationService.kt عبارت TODO: Step 1.6, Unsubscribe to location changes را جستجو کنید.
  2. کد زیر را بعد از کامنت اضافه کنید.
// TODO: Step 1.6, Unsubscribe to location changes.
val removeTask = fusedLocationProviderClient.removeLocationUpdates(locationCallback)
removeTask.addOnCompleteListener { task ->
   if (task.isSuccessful) {
       Log.d(TAG, "Location Callback removed.")
       stopSelf()
   } else {
       Log.d(TAG, "Failed to remove Location Callback.")
   }
}

متد removeLocationUpdates() یک وظیفه (task) تنظیم می‌کند تا به FusedLocationProviderClient اطلاع دهد که دیگر نمی‌خواهید به‌روزرسانی‌های موقعیت مکانی را برای LocationCallback خود دریافت کنید. addOnCompleteListener() فراخوانی را برای تکمیل ارائه می‌دهد و Task را اجرا می‌کند.

همانند مرحله قبل، ممکن است متوجه شده باشید که این کد درون یک دستور try/catch قرار دارد. این متد به چنین بلوکی نیاز دارد زیرا یک SecurityException زمانی رخ می‌دهد که برنامه شما اجازه دسترسی به اطلاعات موقعیت مکانی را نداشته باشد.

شاید برایتان سوال باشد که متدهایی که شامل کد اشتراک/لغو اشتراک هستند چه زمانی فراخوانی می‌شوند. این متدها در کلاس اصلی و زمانی که کاربر روی دکمه کلیک می‌کند، فعال می‌شوند. اگر می‌خواهید آن را ببینید، به کلاس MainActivity.kt نگاهی بیندازید.

اجرای برنامه

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

شما باید اطلاعات موقعیت مکانی را در صفحه خروجی مشاهده کنید. این یک برنامه کاملاً کاربردی برای اندروید ۹ است.

2ae45c4e297e3681.png

d66089bfb532e993.png

۵. پشتیبانی از اندروید ۱۰

در این بخش، پشتیبانی از اندروید ۱۰ را اضافه می‌کنید.

برنامه شما از قبل تغییرات مکان را ثبت می‌کند، بنابراین کار زیادی برای انجام دادن وجود ندارد.

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

کیت توسعه نرم‌افزاری هدف ۲۹

  1. در ماژول base ، در فایل build.gradle به دنبال TODO: Step 2.1, Target Android 10 and then Android 11. بگردید.
  2. این تغییرات را اعمال کنید:
  3. targetSdkVersion روی 29 تنظیم کنید.

کد شما باید چیزی شبیه به این باشد:

android {
   // TODO: Step 2.1, Target Android 10 and then Android 11.
   compileSdkVersion 29
   defaultConfig {
       applicationId "com.example.android.whileinuselocation"
       minSdkVersion 26
       targetSdkVersion 29
       versionCode 1
       versionName "1.0"
   }
...
}

پس از انجام این کار، از شما خواسته می‌شود پروژه خود را همگام‌سازی کنید. روی Sync Now کلیک کنید.

153f70847e0ec320.png

پس از آن، برنامه شما تقریباً برای اندروید ۱۰ آماده است.

نوع سرویس پیش‌زمینه را اضافه کنید

در اندروید ۱۰، در صورت نیاز به دسترسی به موقعیت مکانی در حین استفاده، لازم است نوع سرویس پیش‌زمینه خود را نیز ذکر کنید. در مورد شما، از این سرویس برای دریافت اطلاعات موقعیت مکانی استفاده می‌شود.

در ماژول base ، TODO: 2.2, Add foreground service type در AndroidManifest.xml اضافه کنید و کد زیر را به عنصر <service> اضافه کنید:

android:foregroundServiceType="location"

کد شما باید چیزی شبیه به این باشد:

<application>
   ...

   <!-- Foreground services in Android 10+ require type. -->
   <!-- TODO: 2.2, Add foreground service type. -->
   <service
       android:name="com.example.android.whileinuselocation.ForegroundOnlyLocationService"
       android:enabled="true"
       android:exported="false"
       android:foregroundServiceType="location" />
</application>

همین! برنامه شما با پیروی از بهترین شیوه‌های مکان‌یابی در اندروید، از مکان اندروید ۱۰ برای «هنگام استفاده» پشتیبانی می‌کند.

اجرای برنامه

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

همه چیز باید مثل قبل کار کند، اما حالا روی اندروید ۱۰ هم کار می‌کند. اگر قبلاً مجوزهای مکان‌ها را قبول نکرده‌اید، حالا باید صفحه مجوزها را ببینید!

6a1029175b467c77.png

c7c1d226e49a121.png

39a262b66a275f66.png

۶. پشتیبانی از اندروید ۱۱

در این بخش، شما اندروید ۱۱ را هدف قرار می‌دهید.

خبر عالی، لازم نیست در هیچ فایلی به جز فایل build.gradle تغییری ایجاد کنید!

کیت توسعه نرم‌افزاری هدف ۱۱

  1. در ماژول base ، در فایل build.gradle TODO: Step 2.1, Target SDK را جستجو کنید.
  2. این تغییرات را اعمال کنید:
  3. compileSdkVersion به 30
  4. targetSdkVersion به 30

کد شما باید چیزی شبیه به این باشد:

android {
   TODO: Step 2.1, Target Android 10 and then Android 11.
   compileSdkVersion 30
   defaultConfig {
       applicationId "com.example.android.whileinuselocation"
       minSdkVersion 26
       targetSdkVersion 30
       versionCode 1
       versionName "1.0"
   }
...
}

پس از انجام این کار، از شما خواسته می‌شود پروژه خود را همگام‌سازی کنید. روی Sync Now کلیک کنید.

153f70847e0ec320.png

پس از آن، برنامه شما برای اندروید ۱۱ آماده است!

اجرای برنامه

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

همه چیز باید مثل قبل کار کند، اما حالا روی اندروید ۱۱ هم کار می‌کند. اگر قبلاً مجوزهای مکان‌ها را قبول نکرده‌اید، حالا باید صفحه مجوزها را ببینید!

73d8cc88c5877c25.png

cc98fac6e089bc4.png

۷. استراتژی‌های موقعیت مکانی برای اندروید

با بررسی و درخواست مجوزهای موقعیت مکانی به روش‌های نشان داده شده در این codelab، برنامه شما می‌تواند با موفقیت سطح دسترسی خود را در مورد موقعیت مکانی دستگاه پیگیری کند.

این صفحه چند مورد از بهترین شیوه‌های کلیدی مربوط به مجوزهای مکان را فهرست می‌کند. برای اطلاعات بیشتر در مورد نحوه ایمن نگه داشتن داده‌های کاربران، به بهترین شیوه‌های مجوزهای برنامه مراجعه کنید.

فقط مجوزهای مورد نیاز خود را درخواست کنید

فقط در صورت نیاز درخواست مجوز کنید. برای مثال:

  • مگر اینکه واقعاً ضروری باشد، در هنگام راه‌اندازی برنامه درخواست مجوز موقعیت مکانی نکنید.
  • اگر برنامه شما اندروید ۱۰ یا بالاتر را هدف قرار می‌دهد و یک سرویس پیش‌زمینه دارید، در مانیفست، foregroundServiceType را با مقدار "location" تعریف کنید.
  • مجوزهای موقعیت مکانی پس‌زمینه را درخواست نکنید، مگر اینکه مورد استفاده معتبری داشته باشید، همانطور که در « دسترسی امن‌تر و شفاف‌تر به موقعیت مکانی کاربر» توضیح داده شده است.

پشتیبانی از تخریب تدریجی در صورت عدم اعطای مجوز

برای حفظ یک تجربه کاربری خوب، برنامه خود را طوری طراحی کنید که بتواند به خوبی از پس موقعیت‌های زیر برآید:

  • برنامه شما هیچ دسترسی به اطلاعات موقعیت مکانی ندارد.
  • برنامه شما هنگام اجرا در پس‌زمینه به اطلاعات موقعیت مکانی دسترسی ندارد.

۸. تبریک

شما یاد گرفتید که چگونه با در نظر گرفتن بهترین شیوه‌ها، به‌روزرسانی‌های موقعیت مکانی را در اندروید دریافت کنید!

بیشتر بدانید