درخواست اجازه‌های مکان

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

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

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

هر اجازه ترکیبی از ویژگی‌های زیر را دارد:

مکان پیش‌زمینه‌ای

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

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

اگر یکی از ویژگی‌های برنامه‌تان در یکی از شرایط زیر به مکان فعلی دستگاه دسترسی پیدا کند، سیستم برنامه‌تان را درحال استفاده از مکان پیش‌زمینه درنظر می‌گیرد:

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

    علاوه‌براین، باید نوع سرویس پیش‌زمینه‌ای location را همان‌طور که در تکه‌کد زیر نشان داده شده است اعلام کنید. در Android نسخه ۱۰ (سطح میانای برنامه‌سازی کاربردی ۲۹) و بالاتر، باید این نوع سرویس پیش‌زمینه‌ای را اعلام کنید.

    <!-- Recommended for Android 9 (API level 28) and lower. -->
    <!-- Required for Android 10 (API level 29) and higher. -->
    <service
        android:name="MyNavigationService"
        android:foregroundServiceType="location" ... >
        <!-- Any inner elements would go here. -->
    </service>
    

وقتی برنامه‌تان اجازه ACCESS_COARSE_LOCATION یا اجازه ACCESS_FINE_LOCATION را درخواست می‌کند، نیاز به مکان در پیش‌نما را اعلام می‌کنید، همان‌طور که در قطعه کد زیر نشان داده شده است:

<manifest ... >
  <!-- Always include this permission -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

  <!-- Include only if your app benefits from precise location access. -->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

دسترسی یک‌باره علاوه‌بر دسترسی به داده‌های مکان در پیش‌زمینه، برخی‌از موارد استفاده این ویژگی اضافی را دارند که فقط در نقاط خاصی از تجربه برنامه به دسترسی به مکان کاربر نیاز دارند، برخلاف به‌روزرسانی مداوم درطول استفاده از برنامه. در این موارد، برنامه‌ها باید از دکمه مکان برای درخواست دسترسی به مکان برای همان جلسه استفاده از برنامه استفاده کنند. علاوه‌براین، اگر برنامه شما Android نسخه ۱۷ (سطح API‏ ۳۷) یا بالاتر را هدف قرار می‌دهد و فقط حاوی ویژگی‌هایی است که به دسترسی به مکان مبتنی بر جلسه نیاز دارند، خط‌مشی Google Play شما را ملزم می‌کند از دکمه مکان استفاده کنید. برای جزئیات بیشتر، خط‌مشی دکمه مکان را ببینید.

مکان پس‌زمینه‌ای

اگر ویژگی‌ای در برنامه به‌طور مداوم مکان را با کاربران دیگر هم‌رسانی کند یا از Geofencing API استفاده کند، برنامه به دسترسی به مکان در پس‌زمینه نیاز دارد. چند نمونه شامل موارد زیر است:

  • در برنامه هم‌رسانی مکان خانواده، ویژگی‌ای به کاربران امکان می‌دهد به‌طور مداوم مکانشان را با اعضای خانواده هم‌رسانی کنند.
  • در یک برنامه اینترنت اشیاء، ویژگی‌ای به کاربران اجازه می‌دهد دستگاه‌های خانه‌شان را به‌گونه‌ای پیکربندی کنند که وقتی کاربر خانه را ترک می‌کند خاموش شوند و وقتی کاربر به خانه برمی‌گردد دوباره روشن شوند.

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

در Android نسخه ۱۰ (سطح API‏ ۲۹) و بالاتر، باید اجازه ACCESS_BACKGROUND_LOCATION را در مانیفست برنامه‌تان اعلام کنید تا بتوانید در زمان اجرا، دسترسی به مکان در پس‌زمینه را درخواست کنید. در نسخه‌های قبلی Android، وقتی برنامه‌تان دسترسی به مکان در پیش‌نما را دریافت می‌کند، به‌طور خودکار دسترسی به مکان در پس‌زمینه را نیز دریافت می‌کند.

<manifest ... >
  <!-- Required only when requesting background location access on
       Android 10 (API level 29) and higher. -->
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>

درستی

Android از سطوح زیر برای دقت مکان پشتیبانی می‌کند:

تقریبی
مکان دستگاه را تخمین می‌زند. اگر این تخمین مکان از LocationManagerService یا FusedLocationProvider باشد، این تخمین تا حدود ۳ کیلومتر مربع (حدود ۱٫۲ مایل مربع) دقیق است. وقتی اجازه ACCESS_COARSE_LOCATION را اعلام کنید اما اجازه ACCESS_FINE_LOCATION را اعلام نکنید، برنامه‌تان می‌تواند مکان‌ها را با این سطح از دقت دریافت کند.
دقیق
تخمینی از مکان دستگاه ارائه می‌دهد که تا حد امکان دقیق است. اگر تخمین مکان از LocationManagerService یا FusedLocationProvider باشد، این تخمین معمولاً در حدود ۵۰ متر (۱۶۰ فوت) است و گاهی‌اوقات دقت آن به چند متر (۱۰ فوت) یا بهتر می‌رسد. وقتی اجازه ACCESS_FINE_LOCATION را اعلام کنید، برنامه‌تان می‌تواند مکان‌ها را با این سطح از دقت دریافت کند.

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

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

یادآوری اعطای اجازه مکان در پس‌زمینه

در Android نسخه ۱۰ (میانای برنامه‌سازی کاربردی سطح ۲۹) و بالاتر، وقتی ویژگی‌ای در برنامه‌تان برای اولین‌بار پس‌از اینکه کاربر اجازه دسترسی به مکان پس‌زمینه‌ای را اعطا کرد به مکان دستگاه در پس‌زمینه دسترسی پیدا می‌کند، سیستم اعلانی را برای ارسال به کاربر زمان‌بندی می‌کند. این اعلان به کاربر یادآوری می‌کند که به برنامه شما اجازه داده است همیشه به مکان دستگاه دسترسی داشته باشد. نمونه‌ای از اعلان در شکل ۸ نشان داده شده است.

بررسی کردن الزامات مکان در وابستگی‌های کیت توسعه نرم‌افزار برنامه

بررسی کنید آیا برنامه‌تان از کیت‌های توسعه نرم‌افزاری استفاده می‌کند که به اجازه‌های مکان وابسته هستند، به‌ویژه اجازه ACCESS_FINE_LOCATION. برای اطلاعات بیشتر، پست وبلاگ آشنایی با رفتارهای وابستگی‌های کیت توسعه نرم‌افزار را در Medium ببینید.

منابع بیشتر

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

Codelabs

ویدیوها

نمونه‌ها