تلقّي آخر الأخبار عن المواقع الجغرافية في Android من خلال لغة Kotlin

1. قبل البدء

يمنح Android 10 وAndroid 11 للمستخدمين مزيدًا من التحكُّم في تطبيقاتهم حق الوصول إلى مواقع أجهزتهم.

عندما يطلب أحد التطبيقات التي تعمل بنظام التشغيل Android 11 الوصول إلى الموقع الجغرافي، يكون لدى المستخدمين أربعة خيارات:

  • السماح طوال الوقت
  • السماح عند استخدام التطبيق فقط (في Android 10)
  • مرة واحدة فقط (في نظام Android 11)
  • رفض

Android 10

6a1029175b467c77.png

Android 11

73d8cc88c5877c25.png

في هذا الدرس التطبيقي حول الترميز، ستتعلّم كيفية تلقّي آخر المعلومات حول الموقع الجغرافي وطريقة إتاحة الموقع الجغرافي على أي من إصدارات Android، لا سيّما Android 10 و11. في نهاية الدرس التطبيقي حول الترميز، من المتوقَّع أن يكون لديك تطبيق يتّبع أفضل الممارسات الحالية لاسترداد تحديثات الموقع الجغرافي.

المتطلبات الأساسية

الأنشطة

  • اتّبِع أفضل الممارسات المتعلقة بالموقع الجغرافي في Android.
  • التعامل مع أذونات تحديد الموقع الجغرافي في المقدّمة (عندما يطلب المستخدم وصول تطبيقك إلى الموقع الجغرافي للجهاز عندما يكون التطبيق قيد الاستخدام)
  • يمكنك تعديل تطبيق حالي لإضافة إمكانية طلب الوصول إلى الموقع الجغرافي من خلال إضافة رمز للاشتراك وإلغاء الاشتراك فيه.
  • يمكنك إضافة دعم إلى تطبيق Android 10 وAndroid 11 من خلال إضافة منطق للوصول إلى الموقع الجغرافي في الموقع الجغرافي في المقدِّمة أو أثناء الاستخدام.

المتطلبات

  • الإصدار 3.4 من "استوديو Android" أو إصدار أحدث لتشغيل الرمز
  • جهاز أو محاكي يوفّر معاينة للمطوّرين لنظامَي التشغيل Android 10 وAndroid 11

2. البدء

استنساخ مستودع مشروعات المبتدئين

لمساعدتك على البدء في أسرع وقت ممكن، يمكنك البناء على مشروع البداية هذا. إذا كان Git مثبتًا لديك، فيمكنك ببساطة تشغيل الأمر التالي:

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

يمكنك زيارة صفحة GitHub مباشرةً.

إذا لم يكن لديك Git، فيمكنك الحصول على المشروع كملف ZIP:

استيراد المشروع

فتح "استوديو Android" واختيار "فتح مشروع حالي على استوديو Android" من شاشة الترحيب، وفتح دليل المشروع.

بعد تحميل المشروع، قد يظهر لك أيضًا تنبيه بأن نظام Git لا يتتبّع جميع التغييرات المحلية. يمكنك النقر على تجاهل. (لن يتم إرسال أي تغييرات إلى مستودع Git.)

في الزاوية العلوية اليمنى من نافذة المشروع، من المفترض أن ترى شيئًا مثل الصورة أدناه إذا كنت في طريقة عرض Android. (إذا كنت تستخدم طريقة عرض المشروع، ستحتاج إلى توسيع المشروع لرؤية الشيء نفسه).

fa825dae96c5dc18.png

هناك مجلدان (base وcomplete). تُعرف كل وحدة باسم "وحدة".

تجدر الإشارة إلى أنّ إنشاء المشروع في الخلفية على "استوديو Android" قد يستغرق عدّة ثوانٍ للمرّة الأولى. وخلال هذه الفترة، ستظهر لك الرسالة التالية في شريط الحالة في أسفل "استوديو Android":

c2273e7835c0841a.png

يُرجى الانتظار حتى ينتهي "استوديو Android" من فهرسة المشروع وإنشاءه قبل إجراء تغييرات على الرمز. سيسمح ذلك لـ "استوديو Android" بسحب جميع المكوّنات اللازمة.

إذا ظهرت لك رسالة تطلب منك إعادة التحميل لتطبيق التغييرات على اللغة أو عبارة مشابهة، انقر على نعم.

فهم مشروع المبتدئين

لقد أعددت التطبيق وأصبحت جاهزًا لطلب الموقع الجغرافي في التطبيق. استخدِم وحدة base كنقطة بداية. وخلال كل خطوة، أضِف رمزًا إلى وحدة base. عند الانتهاء من هذا الدرس التطبيقي حول الترميز، يجب أن يتطابق الرمز المتوفّر في وحدة base مع محتوى وحدة complete. يمكن استخدام الوحدة "complete" للتحقّق من عملك أو للرجوع إليها في حال مواجهة أي مشاكل.

تشمل المكوّنات الرئيسية ما يلي:

  • MainActivity: واجهة مستخدم تتيح للمستخدم السماح للتطبيق بالوصول إلى الموقع الجغرافي للجهاز
  • LocationService: خدمة تشترك في تغييرات الموقع الجغرافي أو تلغي الاشتراك فيها، وتروِّج لنفسها في خدمة تعمل في المقدّمة (من خلال إشعار) في حال انتقال المستخدم بعيدًا عن نشاط التطبيق. يمكنك إضافة رمز الموقع هنا.
  • Util: تُضيف دوال الإضافة لفئة Location وتحفظ الموقع الجغرافي في SharedPreferences (طبقة بيانات مبسّطة).

إعداد المحاكي

للحصول على معلومات عن إعداد محاكي Android، يمكنك الاطّلاع على مقالة التشغيل على محاكي.

تنفيذ مشروع التفعيل

شغِّل تطبيقك.

  1. وصِّل جهاز Android بجهاز الكمبيوتر أو ابدأ محاكيًا. (تأكَّد من أنّ الجهاز يعمل بالإصدار 10 من نظام التشغيل Android أو بإصدار أحدث).
  2. في شريط الأدوات، اختَر إعدادات base من المحدِّد المنسدل وانقر على تشغيل:

99600e9d44527ab.png

  1. لاحظ ظهور التطبيق التالي على جهازك:

99bf1dae46f99af3.png

قد تلاحظ عدم ظهور أي معلومات عن الموقع الجغرافي في شاشة الإخراج. هذا لأنك لم تضف رمز الموقع بعد.

3- جارٍ إضافة الموقع الجغرافي

المفاهيم

يركّز هذا الدرس التطبيقي على الترميز لتوضيح كيفية تلقّي آخر المعلومات حول الموقع الجغرافي، وتوفير إمكانية التوافق مع أجهزة Android 10 وAndroid 11 في النهاية.

ومع ذلك، قبل أن تبدأ البرمجة، من المنطقي مراجعة الأساسيات.

أنواع أذونات الوصول إلى الموقع الجغرافي

قد تتذكر الخيارات الأربعة المختلفة للوصول إلى الموقع الجغرافي من بداية الدرس التطبيقي حول الترميز. ألقِ نظرة على ما تعنيه هذه التفسيرات:

  • السماح عند استخدام التطبيق فقط
  • ويُنصَح باستخدام هذا الخيار لمعظم التطبيقات. يُعرف أيضًا باسم "قيد الاستخدام" أو "الواجهة فقط" إذن الوصول، تمت إضافة هذا الخيار في Android 10 ويسمح للمطوّرين باسترداد الموقع الجغرافي فقط أثناء استخدام التطبيق بشكل نشط. يُعتبَر التطبيق نشطًا في حال استيفاء أيّ من المتطلّبات التالية:
  • النشاط مرئي.
  • إحدى الخدمات التي تعمل في المقدّمة تعمل مع إشعار مستمر.
  • مرة واحدة فقط
  • تتم إضافة هذه السمة في الإصدار 11 من نظام التشغيل Android، وهي مماثلة للخيار السماح عند استخدام التطبيق فقط، ولكن لفترة محدودة. لمزيد من المعلومات، يُرجى الاطّلاع على الأذونات لمرة واحدة.
  • رفض
  • يمنع هذا الخيار الوصول إلى معلومات الموقع الجغرافي.
  • السماح طوال الوقت
  • يتيح هذا الخيار الوصول إلى الموقع الجغرافي طوال الوقت، ولكنّه يتطلّب إذنًا إضافيًا لنظام Android 10 والإصدارات الأحدث. عليك أيضًا التأكّد من أن لديك حالة استخدام صالحة والتزامك بما ورد في سياسات المواقع الجغرافية. لن تتحدّث عن هذا الخيار في هذا الدرس التطبيقي حول الترميز، لأنّه حالة استخدام نادرة. ومع ذلك، إذا كانت لديك حالة استخدام صالحة وتريد التعرّف على كيفية التعامل مع الموقع الجغرافي طوال الوقت بشكل صحيح، بما في ذلك الوصول إلى الموقع الجغرافي في الخلفية، يمكنك مراجعة نموذج LocationUpdatesBackgroundKotlin.

الخدمات والخدمات التي تعمل في المقدّمة وعمليات الربط

لإتاحة تحديثات الموقع الجغرافي بشكل كامل من خلال خيار السماح عند استخدام التطبيق فقط، يجب مراعاة وقت خروج المستخدم من تطبيقك. وإذا أردت مواصلة تلقّي آخر الأخبار في هذه الحالة، عليك إنشاء واجهة Service في المقدّمة وربطها بـ Notification.

بالإضافة إلى ذلك، إذا أردت استخدام سياسة Service نفسها لطلب تعديل الموقع الجغرافي عندما يكون التطبيق مرئيًا وعندما ينتقل المستخدم بعيدًا عن التطبيق، عليك ربط أو إلغاء ربط Service بعنصر واجهة المستخدم.

بما أنّ هذا الدرس التطبيقي حول الترميز يركّز فقط على تلقّي إشعارات بشأن الموقع الجغرافي، يمكنك العثور على كل الرموز التي تحتاج إليها في صف ForegroundOnlyLocationService.kt. يمكنك تصفُّح ذلك الصف الدراسي بالإضافة إلى "MainActivity.kt" لمعرفة طريقة عملهما معًا.

لمزيد من المعلومات، يُرجى الاطّلاع على المقالتَين نظرة عامة على الخدمات ونظرة عامة على الخدمات المرتبطة.

الأذونات

لتلقّي تحديثات الموقع الجغرافي من NETWORK_PROVIDER أو GPS_PROVIDER، يجب طلب إذن المستخدم من خلال تقديم بيان عن إذن ACCESS_COARSE_LOCATION أو ACCESS_FINE_LOCATION على التوالي في ملف بيان Android. بدون هذه الأذونات، لن يتمكّن تطبيقك من طلب الوصول إلى الموقع الجغرافي في وقت التشغيل.

تشمل هذه الأذونات حالتَي مرة واحدة فقط والسماح عند استخدام التطبيق فقط عندما يتم استخدام تطبيقك على جهاز يعمل بالإصدار 10 من نظام التشغيل Android أو إصدار أحدث.

الموقع الجغرافي

يمكن لتطبيقك الوصول إلى مجموعة خدمات الموقع الجغرافي المتوافقة من خلال الفئات في حزمة com.google.android.gms.location.

لنلقِ نظرة على الفئات الرئيسية:

  • FusedLocationProviderClient
  • هذا هو العنصر الأساسي في إطار عمل الموقع الجغرافي. وبعد إنشاء الموقع الجغرافي، يمكنك استخدامه لطلب تعديل الموقع الجغرافي والحصول على آخر موقع جغرافي معروف.
  • LocationRequest
  • هذا عنصر بيانات يحتوي على مَعلمات جودة الخدمة للطلبات (الفترات الزمنية للتحديثات والأولويات والدقة). يتم تمرير ذلك إلى FusedLocationProviderClient عندما تطلب تعديلات الموقع الجغرافي.
  • LocationCallback
  • يُستخدَم هذا الزر لتلقّي الإشعارات عند تغيير الموقع الجغرافي للجهاز أو عندما يتعذّر تحديده. بعد ذلك، انتقل إلى LocationResult حيث يمكنك الحصول على Location لحفظه في قاعدة البيانات الخاصة بك.

الآن بعد أن أصبحت لديك فكرة أساسية عما تفعله، ابدأ باستخدام الرمز!

4. إضافة ميزات الموقع الجغرافي

يركّز هذا الدرس التطبيقي حول الترميز على خيار الموقع الجغرافي الأكثر شيوعًا: السماح عند استخدام التطبيق فقط.

لتلقّي آخر المعلومات حول الموقع الجغرافي، يجب أن يعرض تطبيقك نشاطًا مرئيًا أو خدمة تعمل في المقدّمة (مع إشعار).

الأذونات

الغرض من هذا الدرس التطبيقي حول الترميز هو توضيح كيفية تلقّي آخر المعلومات بشأن الموقع الجغرافي، وليس كيفية طلب أذونات تحديد الموقع الجغرافي، لكي يكون الرمز المستند إلى الإذن مكتوبًا نيابةً عنك. لا تتردد في تخطيها إذا كنت تفهمها بالفعل.

في ما يلي أبرز الأذونات (ليس مطلوبًا اتّخاذ أي إجراءات لهذا الجزء):

  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 بالموقع الجديد من خلال بث محلي (إذا كان نشطًا) أو تعديل Notification إذا كانت هذه الخدمة تعمل في المقدّمة Service.

  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.getMainLooper())

تتيح المكالمة 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" وجرِّب زر الموقع الجغرافي.

من المفترض أن تظهر لك معلومات الموقع الجغرافي في شاشة الناتج. هذا تطبيق يعمل بكامل وظائفه على نظام Android 9.

2ae45c4e297e3681.png

d66089bfb532e993.png

5- التوافق مع نظام التشغيل Android 10

في هذا القسم، تتم إضافة الدعم لنظام التشغيل Android 10.

يشترك تطبيقك بالفعل في تغييرات الموقع الجغرافي، لذا ليس هناك الكثير من العمل للقيام به.

في الواقع، كل ما عليك فعله هو تحديد أن الخدمة التي تعمل في المقدّمة يتم استخدامها لأغراض الموقع الجغرافي.

حزمة تطوير البرامج (SDK) 29 المستهدَفة

  1. في وحدة base، ابحث عن TODO: Step 2.1, Target Android 10 and then Android 11. في ملف build.gradle.
  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"
   }
...
}

بعد القيام بذلك، سيُطلب منك مزامنة مشروعك. انقر على المزامنة الآن.

153f70847e0ec320.png

بعد ذلك، سيصبح تطبيقك جاهزًا تقريبًا لنظام Android 10.

إضافة نوع الخدمة التي تعمل في المقدّمة

في نظام التشغيل Android 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" وجرِّب زر الموقع الجغرافي.

من المفترض أن يعمل كل شيء كما كان من قبل، ولكنه يعمل الآن على نظام Android 10. إذا لم تقبل أذونات المواقع الجغرافية من قبل، ستظهر لك الآن شاشة الأذونات.

6a1029175b467c77.png

c7c1d226e49a121.png

39a262b66a275f66.png

6- التوافق مع نظام التشغيل Android 11

في هذا القسم، تستهدف Android 11.

خبر سارّ: ليس عليك إجراء تغييرات على أي ملفات باستثناء ملف build.gradle.

حزمة تطوير البرامج (SDK) المستهدَفة 11

  1. في وحدة base، ابحث عن TODO: Step 2.1, Target SDK في ملف build.gradle.
  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"
   }
...
}

بعد القيام بذلك، سيُطلب منك مزامنة مشروعك. انقر على المزامنة الآن.

153f70847e0ec320.png

بعد ذلك، سيصبح تطبيقك جاهزًا لنظام التشغيل Android 11.

تشغيل التطبيق

شغِّل تطبيقك من "استوديو Android" وجرِّب النقر على الزر.

من المفترض أن تعمل جميع الميزات على النحو المعتاد، ولكنّها الآن تعمل على نظام Android 11. إذا لم تقبل أذونات المواقع الجغرافية من قبل، ستظهر لك الآن شاشة الأذونات.

73d8cc88c5877c25.png

cc98fac6e089bc4.png

7. استراتيجيات الموقع الجغرافي على Android

من خلال التحقّق من أذونات تحديد الموقع الجغرافي وطلبها بالطرق الموضّحة في هذا الدرس التطبيقي حول الترميز، يمكن لتطبيقك تتبُّع مستوى الوصول بنجاح في ما يتعلق بالموقع الجغرافي للجهاز.

تتضمّن هذه الصفحة بعض أفضل الممارسات الأساسية المتعلّقة بأذونات تحديد الموقع الجغرافي. لمزيد من المعلومات حول كيفية الحفاظ على اهتمام الحفاظ على أمان بياناتك، يُرجى الاطّلاع على أفضل الممارسات المتعلقة بأذونات التطبيقات.

طلب الأذونات التي تحتاج إليها فقط

طلب الأذونات عند الحاجة فقط على سبيل المثال:

  • لا تطلب إذن تحديد الموقع الجغرافي عند بدء تشغيل التطبيق ما لم يكن ذلك ضروريًا.
  • إذا كان تطبيقك يستهدف الإصدار 10 من نظام التشغيل Android أو إصدارًا أحدث وكانت لديك خدمة تعمل في المقدّمة، يُرجى تحديد foregroundServiceType من "location" في البيان.
  • لا تطلب أذونات رصد الموقع الجغرافي في الخلفية ما لم تكن لديك حالة استخدام صالحة كما هو موضّح في مقالة الوصول الأكثر أمانًا وشفافية إلى بيانات المستخدم.

دعم التقليص السلس في حال عدم منح الإذن

للحفاظ على تجربة مستخدم جيدة، صمِّم تطبيقك بحيث يمكنه التعامل مع المواقف التالية بسلاسة:

  • لا يمكن لتطبيقك الوصول إلى معلومات الموقع الجغرافي.
  • لا يمكن لتطبيقك الوصول إلى معلومات الموقع الجغرافي عند تشغيله في الخلفية.

8. تهانينا

لقد تعرّفت على كيفية تلقّي آخر المعلومات حول الموقع الجغرافي في Android، مع أخذ أفضل الممارسات في الاعتبار.

مزيد من المعلومات