برای محافظت از حریم خصوصی کاربر، برنامههایی که از سرویسهای موقعیت مکانی استفاده میکنند باید مجوزهای موقعیت مکانی را درخواست کنند.
مجوزهای چندگانه به موقعیت مکانی مربوط میشوند. اینکه کدام مجوزها را درخواست میکنید و چگونه آنها را درخواست میکنید، به الزامات موقعیت مکانی برای مورد استفاده برنامه شما بستگی دارد.
این صفحه انواع مختلف الزامات مکان را شرح میدهد و نحوه درخواست مجوزهای مکان را در هر مورد توضیح میدهد.
برای درخواست مجوزهای مکان، بهترین شیوهها را برای همه مجوزهای زمان اجرا دنبال کنید.
انواع دسترسی به مکان
هر مجوز ترکیبی از ویژگیهای زیر را دارد:
- رده : یا موقعیت پیشزمینه یا موقعیت پسزمینه .
- دقت : یا موقعیت مکانی دقیق یا موقعیت مکانی تقریبی.
مکان پیشزمینه
اگر برنامه شما شامل ویژگیای است که اطلاعات موقعیت مکانی را فقط یک بار یا برای مدت زمان مشخصی به اشتراک میگذارد یا دریافت میکند، آن ویژگی نیاز به دسترسی موقعیت مکانی پیشزمینه دارد. برخی از مثالها شامل موارد زیر است:
- در یک اپلیکیشن ناوبری، یک ویژگی به کاربران امکان میدهد تا مسیرهای گام به گام را دریافت کنند.
- در یک برنامه پیامرسان، یک ویژگی به کاربران اجازه میدهد مکان فعلی خود را با کاربر دیگری به اشتراک بگذارند.
اگر یکی از ویژگیهای برنامه شما در یکی از شرایط زیر به موقعیت مکانی فعلی دستگاه دسترسی پیدا کند، سیستم آن را در حال استفاده از موقعیت مکانی پیشزمینه در نظر میگیرد:
- یک فعالیت (activity) که متعلق به برنامه شماست، قابل مشاهده است.
برنامه شما در حال اجرای یک سرویس پیشزمینه است. وقتی یک سرویس پیشزمینه در حال اجرا است، سیستم با نمایش یک اعلان مداوم، آگاهی کاربر را افزایش میدهد. برنامه شما وقتی در پسزمینه قرار میگیرد، مانند زمانی که کاربر دکمه Home را روی دستگاه خود فشار میدهد یا صفحه نمایش دستگاه خود را خاموش میکند، دسترسی خود را حفظ میکند.
علاوه بر این، شما باید یک نوع سرویس پیشزمینه از
locationتعریف کنید، همانطور که در قطعه کد زیر نشان داده شده است. در اندروید ۱۰ (سطح API ۲۹) و بالاتر، باید این نوع سرویس پیشزمینه را تعریف کنید.<!-- 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>
مکان پسزمینه
اگر یک ویژگی در برنامه دائماً موقعیت مکانی را با سایر کاربران به اشتراک بگذارد یا از API مربوط به Geofencing استفاده کند، برنامه به دسترسی به موقعیت مکانی در پسزمینه نیاز دارد. چندین مثال شامل موارد زیر است:
- در یک برنامه اشتراکگذاری موقعیت مکانی خانوادگی، یک ویژگی به کاربران امکان میدهد تا به طور مداوم موقعیت مکانی خود را با اعضای خانواده به اشتراک بگذارند.
- در یک اپلیکیشن اینترنت اشیا، یک ویژگی به کاربران اجازه میدهد تا دستگاههای خانگی خود را طوری پیکربندی کنند که وقتی کاربر خانه را ترک میکند خاموش شوند و وقتی کاربر به خانه برمیگردد دوباره روشن شوند.
اگر برنامه شما در هر موقعیتی غیر از مواردی که در بخش موقعیت مکانی پیشزمینه توضیح داده شده است، به موقعیت مکانی فعلی دستگاه دسترسی پیدا کند، سیستم آن را در حال استفاده از موقعیت مکانی پسزمینه در نظر میگیرد. دقت موقعیت مکانی پسزمینه همان دقت موقعیت مکانی پیشزمینه است که به مجوزهای مکانی که برنامه شما اعلام میکند بستگی دارد.
در اندروید ۱۰ (سطح 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>
دقت
اندروید از سطوح زیر از دقت موقعیت مکانی پشتیبانی میکند:
- تقریبی
- تخمینی از موقعیت مکانی دستگاه ارائه میدهد. اگر این تخمین موقعیت مکانی از
LocationManagerServiceیاFusedLocationProviderباشد، این تخمین با دقت حدود ۳ کیلومتر مربع (حدود ۱.۲ مایل مربع) دقیق است. برنامه شما میتواند موقعیتهایی را با این سطح از دقت دریافت کند، زمانی که مجوزACCESS_COARSE_LOCATIONرا اعلام کنید، اما مجوزACCESS_FINE_LOCATIONاعلام نکنید. - دقیق
- تخمینی از موقعیت مکانی دستگاه ارائه میدهد که تا حد امکان دقیق باشد. اگر تخمین موقعیت مکانی از
LocationManagerServiceیاFusedLocationProviderباشد، این تخمین معمولاً در حدود ۵۰ متر (۱۶۰ فوت) است و گاهی اوقات به دقت چند متر (۱۰ فوت) یا بهتر میرسد. برنامه شما میتواند موقعیتهایی را با این سطح از دقت دریافت کند، زمانی که مجوزACCESS_FINE_LOCATIONرا اعلام کنید.
اگر کاربر مجوز موقعیت مکانی تقریبی را اعطا کند ، برنامه شما صرف نظر از اینکه کدام مجوزهای موقعیت مکانی را اعلام کرده است، فقط به موقعیت مکانی تقریبی دسترسی خواهد داشت.
برنامه شما باید همچنان کار کند، حتی زمانی که کاربر فقط دسترسی تقریبی به موقعیت مکانی را اعطا میکند. اگر یک ویژگی در برنامه شما قطعاً نیاز به دسترسی به موقعیت مکانی دقیق با استفاده از مجوز ACCESS_FINE_LOCATION دارد، میتوانید از کاربر بخواهید که به برنامه شما اجازه دسترسی به موقعیت مکانی دقیق را بدهد .
یادآوری کمک هزینه موقعیت مکانی پس زمینه
در اندروید ۱۰ (سطح API ۲۹) و بالاتر، وقتی یک ویژگی در برنامه شما برای اولین بار پس از اعطای دسترسی به موقعیت مکانی در پسزمینه توسط کاربر، در پسزمینه به موقعیت مکانی دستگاه دسترسی پیدا میکند، سیستم یک اعلان را برای ارسال به کاربر زمانبندی میکند. این اعلان به کاربر یادآوری میکند که به برنامه شما اجازه داده است که همیشه به موقعیت مکانی دستگاه دسترسی داشته باشد. یک نمونه اعلان در شکل ۸ نشان داده شده است.
الزامات موقعیت مکانی را در وابستگیهای SDK برنامه خود بررسی کنید
بررسی کنید که آیا برنامه شما از SDK هایی استفاده میکند که به مجوزهای موقعیت مکانی، به ویژه مجوز ACCESS_FINE_LOCATION وابسته باشند یا خیر. برای اطلاعات بیشتر، پست وبلاگ «آشنایی با رفتارهای وابستگیهای SDK» را در Medium مطالعه کنید.
منابع اضافی
برای اطلاعات بیشتر در مورد مجوزهای موقعیت مکانی در اندروید، مطالب زیر را مشاهده کنید:
کدلبز
ویدیوها
نمونهها
- برنامه نمونه برای نشان دادن استفاده از مجوزهای موقعیت مکانی.