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

اندروید 10 و 11 به کاربران کنترل بیشتری بر دسترسی برنامه هایشان به مکان های دستگاهشان می دهد.

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

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

اندروید 10

اندروید 11

در این کد لبه، نحوه دریافت به‌روزرسانی‌های مکان و نحوه پشتیبانی از موقعیت مکانی را در هر نسخه از اندروید، به‌ویژه اندروید 10 و 11، یاد می‌گیرید. در پایان کد لبه، می‌توانید برنامه‌ای داشته باشید که از بهترین شیوه‌های فعلی برای بازیابی پیروی می‌کند. به روز رسانی مکان

پیش نیازها

کاری که خواهی کرد

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

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

  • اندروید استودیو 3.4 یا بالاتر برای اجرای کد
  • دستگاه/شبیه‌ساز که پیش‌نمایش برنامه‌نویس اندروید 10 و 11 را اجرا می‌کند

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

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

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

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

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

فایل فشرده را دانلود کنید

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

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

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

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

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

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

قبل از ایجاد تغییرات کد، منتظر بمانید تا Android Studio ایندکس و ساخت پروژه را به پایان برساند. این به Android Studio اجازه می دهد تا تمام اجزای لازم را وارد کند.

اگر درخواستی دریافت کردید که می گوید Reload برای اعمال تغییرات زبان؟ یا چیزی مشابه، بله را انتخاب کنید.

پروژه شروع را درک کنید

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

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

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

راه اندازی شبیه ساز

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

پروژه استارت را اجرا کنید

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

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


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


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

مفاهیم

تمرکز این کد لبه این است که به شما نشان دهد چگونه به‌روزرسانی‌های مکان را دریافت کنید و در نهایت از اندروید 10 و اندروید 11 پشتیبانی کنید.

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

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

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

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

خدمات، خدمات پیش زمینه، و الزام آور

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

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

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

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

مجوزها

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

زمانی که برنامه شما در دستگاهی با Android 10 یا بالاتر استفاده می‌شود، این مجوزها فقط یک بار و فقط مجاز در هنگام استفاده از موارد برنامه را پوشش می‌دهند.

محل

برنامه شما می‌تواند از طریق کلاس‌های موجود در بسته 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)

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

LocationRequest را راه اندازی کنید

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

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

// TODO: Step 1.3, Create a LocationRequest.
locationRequest = LocationRequest().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. نظرات را بخوانید تا بفهمید هر کدام چگونه کار می کنند.

موقعیت تماس Callback را راه اندازی کنید

  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)

       if (locationResult?.lastLocation != null) {

           // 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 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))
           }
       } else {
           Log.d(TAG, "Location information isn't available.")
       }
   }
}

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

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

  1. نظرات را بخوانید تا بفهمید هر قسمت چه کاری انجام می دهد.

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

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

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

فراخوانی requestLocationUpdates requestLocationUpdates() به FusedLocationProviderClient اجازه می دهد بداند که می خواهید به روز رسانی های مکان را دریافت کنید.

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

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

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

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

  1. در ماژول base ، TODO: Step 1.6, Unsubscribe to location changes در فایل ForegroundOnlyLocationService.kt .
  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() وظیفه ای را تنظیم می کند تا FusedLocationProviderClient بداند که دیگر نمی خواهید به روز رسانی های مکان را برای LocationCallback خود دریافت کنید. addOnCompleteListener() فراخوانی را برای تکمیل می دهد و Task را اجرا می کند.

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

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

برنامه را اجرا کنید

برنامه خود را از Android Studio اجرا کنید و دکمه مکان را امتحان کنید.

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

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

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

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

هدف SDK 29

  1. در ماژول base ، TODO: Step 2.1, Target SDK 10 را در فایل build.gradle کنید.
  2. این تغییرات را انجام دهید:
  1. compileSdkVersion را روی 29 تنظیم کنید.
  2. buildToolsVersion را روی "29.0.3" تنظیم کنید.
  3. targetSdkVersion را روی 29 تنظیم کنید.

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

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

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

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

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

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

در ماژول 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>

خودشه! برنامه شما از مکان Android 10 برای «در حین استفاده» با پیروی از بهترین روش‌ها برای مکان در Android پشتیبانی می‌کند.

برنامه را اجرا کنید

برنامه خود را از Android Studio اجرا کنید و دکمه مکان را امتحان کنید.

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

در این بخش اندروید 11 را هدف قرار می دهید.

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

هدف SDK R

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

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

android {
   // TODO: Step 2.1, Target Android 10.
   compileSdkVersion "android-R"
   buildToolsVersion "29.0.2"
   defaultConfig {
       applicationId "com.example.android.whileinuselocation"
       minSdkVersion 26
       targetSdkVersion "R"
       versionCode 1
       versionName "1.0"
   }
...
}

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

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

برنامه را اجرا کنید

برنامه خود را از Android Studio اجرا کنید و روی دکمه کلیک کنید.

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

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

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

فقط مجوزهای مورد نیاز خود را بخواهید

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

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

در صورت عدم صدور مجوز، از تخریب برازنده حمایت کنید

برای حفظ یک تجربه کاربری خوب، برنامه خود را طوری طراحی کنید که بتواند شرایط زیر را به خوبی مدیریت کند:

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

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

بیشتر بدانید