دليل تنفيذ ميزة "الاشتراك المتحقَّق منه" السريع

نظرة عامة

واجهة برمجة التطبيقات iOS واجهة برمجة التطبيقات

تتوفّر "منصة خرائط Google" للويب (JS وTS) وAndroid وiOS، وتوفّر أيضًا واجهات برمجة تطبيقات لخدمات الويب تتيح لك الحصول على معلومات حول الأماكن والاتجاهات والمسافات. النماذج الواردة في هذا الدليل مكتوبة لمنصة واحدة، ولكن يتم توفير روابط مستندات للتنفيذ على منصات أخرى.

أنشِئه الآن.

تتيح لك أداة الإنشاء السريعة في Google Cloud Console إمكانية إنشاء ميزة الإكمال التلقائي لنموذج العناوين باستخدام واجهة مستخدم تفاعلية تنشئ رمز JavaScript لك.

فقد اعتاد المستخدمون على العيش في عالم رقمي حيث تصبح الراحة والسرعة والأمان هي التوقعات الأساسية. فعندما يتقدمون بطلب للحصول على شيء مثل بطاقة ائتمان أو حساب مصرفي أو قرض، فإنهم يتوقعون أن تكون العملية سريعة وسهلة.

كلما زاد عدد المستخدمين الذين يتعين عليهم كتابة بيانات مكررة أو إدخالها، قلت فرصة الاحتفاظ بهم كعملاء. إنّ إنشاء تجربة اشتراك سريعة وسهلة وتم التحقّق منها سيؤدي إلى تحسين تجربة المستخدم، ويساعدك في الوقت نفسه على إبقاء المستخدمين على موقعك الإلكتروني.

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

يقدّم هذا الموضوع إرشادات التنفيذ لإنشاء تجربة "اشتراك سريع وتمّ التحقّق منه" في "منصة خرائط Google". نظرًا لأن المستخدمين سيشتركون على الأرجح من خلال الأجهزة المحمولة، فإن معظم أمثلة التنفيذ في هذا الموضوع تركز على Android. (يمكنك الاطّلاع على نموذج المصدر الكامل هنا). يمكنك أيضًا استخدام حِزم تطوير البرامج (SDK) لنظام التشغيل iOS لإنجاز المهام نفسها.

يوضح المخطّط التالي واجهات برمجة التطبيقات الأساسية المستخدمة في إنشاء الحل (انقر للتكبير).

تمكين واجهات برمجة التطبيقات

لتنفيذ هذه الاقتراحات، يجب تفعيل واجهات برمجة التطبيقات التالية في Google Cloud Console:

لمزيد من المعلومات حول الإعداد، يُرجى الاطّلاع على بدء استخدام "منصة خرائط Google".

أقسام أفضل الممارسات

في ما يلي الممارسات والتخصيصات التي سنتناولها في هذا الموضوع.

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

إضافة ميزة "الإكمال التلقائي" إلى حقول الإدخال

يستخدم هذا المثال: حزمة تطوير برامج الأماكن لأجهزة Android متوفّر أيضًا: iOS | JavaScript

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

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

عندما يختار المستخدم مربّع الإدخال "الإكمال التلقائي" ويبدأ في الكتابة، تظهر قائمة بتوقّعات العناوين.

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

الفيديوهات: تحسين نماذج العناوين باستخدام ميزة "الإكمال التلقائي" للأماكن

نماذج العناوين

Android

iOS

الويب

توفّر "منصة خرائط Google" أداة "الإكمال التلقائي" للأماكن المخصّصة ومنصات الويب للأجهزة الجوّالة. وتوفر الأداة، التي تظهر في الأشكال السابقة، مربع حوار بحث مع وظيفة الإكمال التلقائي المدمجة التي يمكنك حتى تحسينها للبحث على نطاق الموقع.

يصف هذا القسم كيفية تنفيذ ميزة "الإكمال التلقائي" للأماكن من أجل الاشتراك السريع الذي تم التحقق منه.

إضافة أداة الإكمال التلقائي للأماكن

في Android، يمكنك إضافة أداة الإكمال التلقائي باستخدام هدف الإكمال التلقائي الذي يشغِّل الإكمال التلقائي للأماكن من حقل إدخال سطر العنوان 1، حيث يبدأ المستخدم في إدخال عنوانه. عندما يبدأ المستخدم في الكتابة، سيتمكن من اختيار عنوانه من قائمة توقعات الإكمال التلقائي.

أولاً، عليك إعداد مشغّل الأنشطة، باستخدام ActivityResultLauncher، الذي يستمع إلى نتيجة من النشاط الذي تم إطلاقه. وستحتوي نتيجة معاودة الاتصال على عنصر "مكان" يقابل العنوان الذي يختاره المستخدم من تنبؤات الإكمال التلقائي.

    private final ActivityResultLauncher<Intent> startAutocomplete = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            result -> {
                if (result.getResultCode() == Activity.RESULT_OK) {
                    Intent intent = result.getData();
                    if (intent != null) {
                        Place place = Autocomplete.getPlaceFromIntent(intent);

                        // Write a method to read the address components from the Place
                        // and populate the form with the address components
                        Log.d(TAG, "Place: " + place.getAddressComponents());
                        fillInAddress(place);
                    }
                } else if (result.getResultCode() == Activity.RESULT_CANCELED) {
                    // The user canceled the operation.
                    Log.i(TAG, "User canceled autocomplete");
                }
            });

بعد ذلك، حدِّد الحقول والموقع الجغرافي وخصائص النوع لميزة "الإكمال التلقائي" لهدف المكان وأنشئها باستخدام Autocomplete.IntentBuilder. أخيرًا، يمكنك إطلاق intent باستخدام ActivityResultLauncher المحدّد في نموذج الرمز البرمجي السابق.

    private void startAutocompleteIntent() {

        // Set the fields to specify which types of place data to
        // return after the user has made a selection.
        List<Place.Field> fields = Arrays.asList(Place.Field.ADDRESS_COMPONENTS,
                Place.Field.LAT_LNG, Place.Field.VIEWPORT);

        // Build the autocomplete intent with field, country, and type filters applied
        Intent intent = new Autocomplete.IntentBuilder(AutocompleteActivityMode.OVERLAY, fields)
                .setCountries(Arrays.asList("US"))
                .setTypesFilter(new ArrayList<String>() {{
                    add(TypeFilter.ADDRESS.toString().toLowerCase());
                }})
                .build(this);
        startAutocomplete.launch(intent);
    }

التعامل مع العنوان الذي تعرضه ميزة "الإكمال التلقائي" للأماكن

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

    private final ActivityResultLauncher<Intent> startAutocomplete = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            result -> {
                if (result.getResultCode() == Activity.RESULT_OK) {
                    Intent intent = result.getData();
                    if (intent != null) {
                        Place place = Autocomplete.getPlaceFromIntent(intent);

                        // Write a method to read the address components from the Place
                        // and populate the form with the address components
                        Log.d(TAG, "Place: " + place.getAddressComponents());
                        fillInAddress(place);
                    }
                } else if (result.getResultCode() == Activity.RESULT_CANCELED) {
                    // The user canceled the operation.
                    Log.i(TAG, "User canceled autocomplete");
                }
            });

من هناك، يمكنك استدعاء Place.getAddressComponents() ومطابقة كل مكوّن عنوان مع حقل الإدخال المقابل له في نموذج العنوان، مع تعبئة الحقل بالقيمة من "المكان" الذي اختاره المستخدم.

يساعد التقاط بيانات العنوان من التنبؤ بدلاً من العنوان المُدخل يدويًا في ضمان دقة العنوان، ويضمن أن يكون العنوان معروفًا ويمكن تسليمه إليه، ويقلل من ضغطات مفاتيح المستخدم.

الاعتبارات الواجب مراعاتها عند تنفيذ الإكمال التلقائي للأماكن

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

  • بالنسبة إلى نموذج ADDRESS، يجب ضبط معلمة الأنواع على address لقصر عمليات المطابقة على عناوين الشوارع الكاملة. اطّلِع على مزيد من المعلومات عن الأنواع المتاحة في طلبات الإكمال التلقائي للأماكن.

  • حدِّد القيود والانحيازات المناسبة إذا لم تكن بحاجة إلى البحث في جميع أنحاء العالم. هناك عدد من المعلمات التي يمكن استخدامها لتحيز أي مطابقة أو تقييدها لمناطق معينة فقط.

    • يمكنك استخدام RectangularBounds لضبط الحدود المستطيلة لفرض قيود على منطقة معيّنة، واستخدام setLocationRestriction() للتأكّد من عرض العناوين في تلك المناطق فقط.

    • استخدِم setCountries() لحصر الردود على مجموعة محدّدة من البلدان.

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

تقديم تأكيد مرئي للعنوان

يستخدم هذا المثال: حزمة تطوير البرامج بالاستناد إلى بيانات "خرائط Google" لتطبيقات Android متوفّر أيضًا: iOS | JavaScript

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

يوضح الشكل التالي خريطة أسفل العنوان مع دبوس على العنوان الذي تم إدخاله.

يتبع المثال التالي الخطوات الأساسية لإضافة خريطة في Android. يُرجى مراجعة المستندات للاطّلاع على مزيد من التفاصيل.

جارٍ إضافة "SupportMapFragment".

أولاً، أضِف جزء SupportMapFragment إلى ملف XML للتنسيق.

    <fragment
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:id="@+id/confirmation_map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

بعد ذلك، أضِف الجزء آليًا في حال لم يكن متوفّرًا بعد.

    private void showMap(Place place) {
        coordinates = place.getLatLng();

        // It isn't possible to set a fragment's id programmatically so we set a tag instead and
        // search for it using that.
        mapFragment = (SupportMapFragment)
                getSupportFragmentManager().findFragmentByTag(MAP_FRAGMENT_TAG);

        // We only create a fragment if it doesn't already exist.
        if (mapFragment == null) {
            mapPanel = ((ViewStub) findViewById(R.id.stub_map)).inflate();
            GoogleMapOptions mapOptions = new GoogleMapOptions();
            mapOptions.mapToolbarEnabled(false);

            // To programmatically add the map, we first create a SupportMapFragment.
            mapFragment = SupportMapFragment.newInstance(mapOptions);

            // Then we add it using a FragmentTransaction.
            getSupportFragmentManager()
                    .beginTransaction()
                    .add(R.id.confirmation_map, mapFragment, MAP_FRAGMENT_TAG)
                    .commit();
            mapFragment.getMapAsync(this);
        } else {
            updateMap(coordinates);
        }
    }

الحصول على اسم معرِّف للجزء وتسجيل معاودة الاتصال

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

  2. ويمكنك استدعاء الطريقة getMapAsync لضبط رد الاتصال على الجزء.

على سبيل المثال، إذا أضفت الجزء بشكل ثابت:

Kotlin



val mapFragment = supportFragmentManager
    .findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)

      

Java


SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
    .findFragmentById(R.id.map);
mapFragment.getMapAsync(this);

      

تصميم وإضافة علامة إلى الخريطة

عندما تكون الخريطة جاهزة، يمكنك ضبط النمط وجعل الكاميرا في الوسط وإضافة علامة عند إحداثيات العنوان الذي تم إدخاله. يستخدم الرمز التالي نمطًا محدّدًا في كائن JSON أو يمكنك بدلاً من ذلك تحميل معرّف خريطة تم تحديده من خلال نمط الخرائط المستنِد إلى السحابة الإلكترونية.

    @Override
    public void onMapReady(@NonNull GoogleMap googleMap) {
        map = googleMap;
        try {
            // Customise the styling of the base map using a JSON object defined
            // in a string resource.
            boolean success = map.setMapStyle(
                    MapStyleOptions.loadRawResourceStyle(this, R.raw.style_json));

            if (!success) {
                Log.e(TAG, "Style parsing failed.");
            }
        } catch (Resources.NotFoundException e) {
            Log.e(TAG, "Can't find style. Error: ", e);
        }
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(coordinates, 15f));
        marker = map.addMarker(new MarkerOptions().position(coordinates));
    }

(الاطّلاع على عيّنة الرموز الكاملة)

جارٍ إيقاف عناصر التحكم في الخريطة

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

مقارنة العنوان الذي أدخله المستخدم بالموقع الجغرافي للجهاز

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

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

تتضمن عملية مقارنة العنوان الذي تم إدخاله بموقع الجهاز الخطوات التالية:

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

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

تحويل العنوان الذي أدخله المستخدم إلى إحداثيات جغرافية

يستخدم هذا المثال: حزمة تطوير برامج الأماكن لأجهزة Android متوفّر أيضًا: iOS | JavaScript | Geocoding API

بعد موافقة المستخدمين على التحقق من العنوان (من خلال لمس "التحقق من وجودي الآن" في الشكل السابق)، تتمثل الخطوة الأولى في مقارنة العنوان بالموقع الحالي في تحويل العنوان الذي تم إدخاله إلى إحداثيات جغرافية.

إذا اختار المستخدم عنوانه باستخدام ميزة الإكمال التلقائي للأماكن، تأكَّد من طلب Place.Field.LAT_LNG في قائمة حقول الإكمال التلقائي للأماكن كما هو موضّح في مقتطف الرمز إضافة أداة الإكمال التلقائي للأماكن، ثم استدعِ الطريقة Place.getLatLng() للحصول على الإحداثيات الجغرافية للعنوان المحدّد.

coordinates = place.getLatLng();

إذا أدخل المستخدم عنوانه يدويًا أو أجرى تعديلات بعد أن ملأت ميزة "الإكمال التلقائي" الحقول، استخدِم خدمة Android Geocoder أو Geocoding API للبحث عن الإحداثيات المقابلة لذلك العنوان.

مثال

https://maps.googleapis.com/maps/api/geocode/json?address=1600%20Amphitheatre%2BParkway%2C%20Mountain%20View%2C%20CA%2094043&key=YOUR_API_KEY

احرص على ترميز عنوان URL للاستدعاء إلى واجهة برمجة تطبيقات Geocoding.

المرجع السريع لترميز عناوين URL: %20 = مسافة، %2B = + (علامة الجمع)، %2C = ، (فاصلة)

طلب الإذن من المستخدم للحصول على الموقع الجغرافي للجهاز

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

  • يمكنك طلب إذن تحديد الموقع الجغرافي على مستوى دقيق (ACCESS_FINE_LOCATION)، كمنحة لمرة واحدة.

  • إذا منح المستخدم إذن الوصول إلى الموقع الجغرافي، احصل على الموقع الجغرافي للمستخدم.

  • إذا رفض المستخدم إذن الوصول إلى الموقع الجغرافي، تعامل مع الرفض على نحو ملائم. على سبيل المثال، يمكنك تقديم النوع التالي من الرسائل (على افتراض عدم تخزين الموقع الحالي للمستخدم):

    "إذا لم تسمح للتطبيق بمعرفة موقعك الدقيق، فستحتاج إلى إثبات الملكية عبر البريد لتنشيط حسابك. [حسنًا]"

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

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

    // Register the permissions callback, which handles the user's response to the
    // system permissions dialog. Save the return value, an instance of
    // ActivityResultLauncher, as an instance variable.
    private final ActivityResultLauncher<String> requestPermissionLauncher =
            registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
                if (isGranted) {
                    // Since ACCESS_FINE_LOCATION is the only permission in this sample,
                    // run the location comparison task once permission is granted.
                    // Otherwise, check which permission is granted.
                    getAndCompareLocations();
                } else {
                    // Fallback behavior if user denies permission
                    Log.d(TAG, "User denied permission");
                }
            });

بعد ذلك، تحقَّق مما إذا كان التطبيق لديه إذن "ACCESS_FINE_LOCATION". إذا لم يظهر، فاطلب من المستخدم إجراء ذلك من خلال بدء نشاط طلب الإذن باستخدام مشغّل التطبيقات المحدّد في الخطوة السابقة.

    private void checkLocationPermissions() {
        if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            getAndCompareLocations();
        } else {
            requestPermissionLauncher.launch(
                    ACCESS_FINE_LOCATION);
        }
    }

بعد منح إذن ACCESS_FINE_LOCATION، يمكنك استخدام موفّر الموقع الجغرافي المدمج للحصول على آخر موقع جغرافي معروف للجهاز وإنشاء عنصر LatLng منه.

        FusedLocationProviderClient fusedLocationClient =
                LocationServices.getFusedLocationProviderClient(this);

        fusedLocationClient.getLastLocation()
                .addOnSuccessListener(this, location -> {
                    // Got last known location. In some rare situations this can be null.
                    if (location == null) {
                        return;
                    }

                    deviceLocation = new LatLng(location.getLatitude(), location.getLongitude());
                    // ...
                });
    }

جارٍ احتساب المسافة بين العنوان الذي تم إدخاله والموقع الجغرافي للجهاز.

استخدِم الرياضيات لحساب المسافة بين إحداثيَّي خطوط الطول/العرض (العنوان الذي تم إدخاله وموقع الجهاز الجغرافي). تضم حزمة تطوير البرامج (SDK) المفتوحة المصدر لخرائط Google لمكتبة أدوات Android بعض الطرق المفيدة لحساب المسافة الكروية بين نقطتين على Earth.

أولاً، عليك تثبيت حزمة تطوير البرامج (SDK) للخرائط لمكتبة أدوات Android من خلال إضافة الاعتمادية التالية إلى ملف build.gradle لتطبيقك:

dependencies {


    // Utility Library for Maps SDK for Android
    // You do not need to add a separate dependency for the Maps SDK for Android
    // since this library builds in the compatible version of the Maps SDK.
    implementation 'com.google.maps.android:android-maps-utils:3.8.0'
}

ثم، مرة أخرى في ملف النشاط بعد الحصول على آخر موقع معروف للجهاز، حدد نصف القطر بالأمتار لتعتبر أن الموقعين "متطابقين". يجب أن يكون النطاق الجغرافي كبيرًا بما يكفي لمراعاة التباين في دقة نظام تحديد المواقع العالمي (GPS) وحجم المكان في عنوان المستخدم الذي أدخله. مثلاً:

private static final double acceptableProximity = 150;

بعد ذلك، استخدِم طريقة مكتبة الخدمات computeDistanceBetween() لحساب المسافة بين الموقع الجغرافي للجهاز وموقع العنوان الذي أدخله المستخدم. إذا كانت المسافة تقع ضمن نصف القطر المحدد أعلاه، ففكر في المواقع المتطابقة.

// Use the computeDistanceBetween function in the Maps SDK for Android Utility Library
// to use spherical geometry to compute the distance between two Lat/Lng points.
double distanceInMeters = computeDistanceBetween(deviceLocation, enteredLocation);
if (distanceInMeters <= acceptedProximity) {
    Log.d(TAG, "location matched");
    // TODO: Display UI based on the locations matching
} else {
    Log.d(TAG, "location not matched");
    // TODO: Display UI based on the locations not matching
}

(الاطّلاع على عيّنة الرموز الكاملة)

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

نصائح لتحسين ميزة "الاشتراك السريع والذي تم التحقّق منه"

اسمح للمستخدمين بإدخال عنوان استنادًا إلى اسم النشاط التجاري أو نقطة الاهتمام. لا تعمل خدمة التنبؤ "قبل الكتابة" للعناوين فحسب، بل يمكنك أيضًا اختيار السماح للمستخدمين بإدخال أسماء الأنشطة التجارية أو المعالم. للسماح بإدخال كل من العناوين وأسماء المؤسسات، عليك إزالة السمة types من تعريف الإكمال التلقائي.

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