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

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

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

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

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

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

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

موقعیت پیش زمینه

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

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

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

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

    علاوه بر این، همانطور که در قطعه کد زیر نشان داده شده است، باید نوع location مکانی سرویس پیش زمینه را اعلام کنید. در اندروید 10 (سطح API 29) و بالاتر، باید این نوع سرویس پیش زمینه را اعلام کنید.

    <!-- 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>

موقعیت مکانی پس زمینه

اگر یک ویژگی در برنامه دائماً مکان را با سایر کاربران به اشتراک می‌گذارد یا از Geofencing API استفاده می‌کند، یک برنامه نیاز به دسترسی به موقعیت مکانی پس‌زمینه دارد. چندین مثال شامل موارد زیر است:

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

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

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

<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 باشد، این تخمین در حدود 3 کیلومتر مربع (حدود 1.2 مایل مربع) دقیق است. وقتی مجوز ACCESS_COARSE_LOCATION را اعلام می‌کنید، اما مجوز ACCESS_FINE_LOCATION نه، برنامه شما می‌تواند مکان‌هایی با این سطح از دقت دریافت کند.
دقیق
تخمین موقعیت مکانی دستگاه را ارائه می دهد که تا حد امکان دقیق باشد. اگر تخمین مکان از LocationManagerService یا FusedLocationProvider باشد، این تخمین معمولاً در حدود 50 متر (160 فوت) است و گاهی اوقات به اندازه چند متر (10 فوت) یا بهتر است. با اعلام مجوز ACCESS_FINE_LOCATION برنامه شما می‌تواند مکان‌هایی با این سطح از دقت دریافت کند.

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

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

یادآوری اعطای موقعیت مکانی پس زمینه

در Android 10 (سطح API 29) و بالاتر، وقتی یک ویژگی در برنامه شما برای اولین بار پس از اعطای دسترسی کاربر به موقعیت مکانی پس‌زمینه، به موقعیت مکانی دستگاه در پس‌زمینه دسترسی پیدا می‌کند، سیستم اعلانی را برای ارسال به کاربر برنامه‌ریزی می‌کند. این اعلان به کاربر یادآوری می‌کند که به برنامه شما اجازه داده است همیشه به مکان دستگاه دسترسی داشته باشد. یک نمونه اعلان در شکل 8 نشان داده شده است.

الزامات مکان را در وابستگی های SDK برنامه خود بررسی کنید

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

منابع اضافی

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

Codelabs

ویدیوها

نمونه ها