نقل البيانات إلى برنامج SDK لأماكن جديدة

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

إن الطريقة الوحيدة للوصول إلى الميزات وإصلاحات الأخطاء في Places SDK لأجهزة Android الأحدث من الإصدار 2.6.0 ستكون هي استخدام حزمة تطوير برامج الأماكن لأجهزة Android. تنصح Google بالتحديث من مكتبة التوافق إلى حزمة تطوير البرامج (SDK) الجديدة لـ "الأماكن" لإصدار Android في أقرب وقت ممكن.

ما التغييرات التي أُجريت؟

في ما يلي الجوانب الرئيسية للتغيير:

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

حول مكتبة توافق الأماكن

وفي كانون الثاني (يناير) 2019 مع طرح الإصدار 1.0 من حزمة تطوير برامج الأماكن المستقلة لنظام التشغيل Android، وفّرت Google مكتبة توافق للمساعدة في نقل البيانات من إصدار خدمات Google Play الذي تم إيقافه من قبل حزمة تطوير برامج الأماكن لنظام التشغيل Android (com.google.android.gms:play-services-places).

تم توفير مكتبة التوافق هذه مؤقتًا لإعادة توجيه وترجمة طلبات البيانات من واجهة برمجة التطبيقات التي تستهدف إصدار "خدمات Google Play" إلى الإصدار الجديد المستقل إلى أن يتمكّن المطوّرون من نقل الرموز البرمجية الخاصة بهم لاستخدام الأسماء الجديدة في حزمة SDK المستقلة. بالنسبة إلى كل إصدار من حزمة تطوير برامج الأماكن لأجهزة Android التي تم طرحها من الإصدار 1.0 إلى الإصدار 2.6.0، تم طرح إصدار مقابل من مكتبة التوافق في الأماكن لتوفير وظائف مكافئة.

تجميد وإيقاف مكتبة التوافق في الأماكن

تم إيقاف جميع إصدارات مكتبة التوافق الخاصة بـ "حزمة تطوير البرامج (SDK) للأماكن" في Android اعتبارًا من 31 آذار (مارس) 2022. الإصدار 2.6.0 هو الإصدار الأخير من مكتبة توافق الأماكن. تتمثل الطريقة الوحيدة للوصول إلى الميزات وإصلاحات الأخطاء في حزمة SDK للأماكن لنظام التشغيل Android في الإصدارات الأحدث من الإصدار 2.6.0 في استخدام حزمة تطوير البرامج للأماكن لأجهزة Android.

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

تثبيت مكتبة البرامج

يتم توزيع الإصدار الجديد من حزمة أماكن Google لنظام التشغيل Android كمكتبة برامج ثابتة.

استخدِم Maven لإضافة حزمة تطوير برامج الأماكن لنظام التشغيل Android إلى مشروعك على "استوديو Android":

  1. إذا كنت تستخدم حاليًا مكتبة توافق الأماكن:

    1. استبدِل السطر التالي في القسم dependencies:

          implementation 'com.google.android.libraries.places:places-compat:X.Y.Z'

      باستخدام هذا السطر للتبديل إلى حزمة تطوير برامج الأماكن لأجهزة Android:

          implementation 'com.google.android.libraries.places:places:3.3.0'

  2. إذا كنت تستخدم حاليًا إصدار "خدمات Play" من حزمة تطوير برامج الأماكن لنظام التشغيل Android:

    1. استبدِل السطر التالي في القسم dependencies:

          implementation 'com.google.android.gms:play-services-places:X.Y.Z'

      باستخدام هذا السطر للتبديل إلى حزمة تطوير برامج الأماكن لأجهزة Android:

          implementation 'com.google.android.libraries.places:places:3.3.0'

  3. مزامنة مشروع Gradle

  4. اضبط السمة minSdkVersion لمشروع تطبيقك على 16 أو أعلى.

  5. تعديل مواد العرض "مُشغَّل بواسطة Google":

    @drawable/powered_by_google_light // OLD
    @drawable/places_powered_by_google_light // NEW
    @drawable/powered_by_google_dark // OLD
    @drawable/places_powered_by_google_dark // NEW
    
  6. يمكنك إنشاء تطبيقك. إذا ظهرت لك أي أخطاء في الإصدار بسبب التحويل إلى حزمة تطوير برامج الأماكن لنظام التشغيل Android، يمكنك الاطّلاع على الأقسام أدناه للحصول على معلومات عن كيفية حل هذه الأخطاء.

إعداد برنامج حزمة تطوير البرامج (SDK) الجديد للأماكن

يجب إعداد برنامج حزمة تطوير البرامج (SDK) الجديد لـ "الأماكن" كما هو موضّح في المثال التالي:

// Add an import statement for the client library.
import com.google.android.libraries.places.api.Places;

...

// Initialize Places.
Places.initialize(getApplicationContext(), apiKey);

// Create a new Places client instance.
PlacesClient placesClient = Places.createClient(this);

رموز الحالة

تم تغيير رمز حالة أخطاء الحد الأقصى لعدد الطلبات في الثانية (QPS). يتم الآن إرجاع أخطاء حد عدد الطلبات في الثانية عبر PlaceStatusCodes.OVER_QUERY_LIMIT. ما مِن حدود "QPD".

تمت إضافة رموز الحالة التالية:

  • REQUEST_DENIED: تم رفض الطلب. وتشمل الأسباب المحتملة ما يلي:

    • لم يتم تقديم أي مفتاح لواجهة برمجة التطبيقات.
    • تم إدخال مفتاح غير صالح لواجهة برمجة التطبيقات.
    • لم يتم تفعيل Places API في Cloud Console.
    • تم تقديم مفتاح واجهة برمجة تطبيقات مع قيود مفتاح غير صحيحة.
  • INVALID_REQUEST — الطلب غير صالح بسبب وجود وسيطة غير موجودة أو غير صالحة.

  • NOT_FOUND — لم يتم العثور على أي نتائج للطلب المحدّد.

الطرق الجديدة

يقدم الإصدار الجديد من حزمة تطوير برامج الأماكن لأجهزة Android طرقًا جديدة تمامًا تم تصميمها لتحقيق الاتساق. تلتزم جميع الطرق الجديدة بما يلي:

  • لم تعد نقاط النهاية تستخدم الفعل get.
  • تشترك كائنات الطلب والاستجابة في نفس اسم طريقة العميل المقابلة.
  • تحتوي عناصر الطلب الآن على أدوات إنشاء؛ ويتم تمرير المَعلمات المطلوبة كمَعلمات لأداة إنشاء الطلبات.
  • لم تعُد الموارد الاحتياطية مستخدمة.

يقدم هذا القسم الطرق الجديدة ويوضح لك كيفية عملها.

استرجاع مكان باستخدام رقم التعريف

يمكنك استخدام fetchPlace() للحصول على تفاصيل حول مكان معيّن. تعمل fetchPlace() بشكل مشابه لـ getPlaceById().

اتبع الخطوات التالية لجلب مكان:

  1. يمكنك استدعاء fetchPlace()، مع تمرير كائن FetchPlaceRequest لتحديد معرّف المكان وقائمة الحقول التي تحدد بيانات المكان المطلوب عرضها.

    // Define a Place ID.
    String placeId = "INSERT_PLACE_ID_HERE";
    
    // Specify the fields to return.
    List<Place.Field> placeFields = Arrays.asList(Place.Field.ID, Place.Field.NAME);
    
    // Construct a request object, passing the place ID and fields array.
    FetchPlaceRequest request = FetchPlaceRequest.builder(placeId, placeFields)
            .build();
    
    
  2. يمكنك الاتصال بـ addOnSuccessListener() للتعامل مع FetchPlaceResponse. ويتم عرض نتيجة Place واحدة.

    // Add a listener to handle the response.
    placesClient.fetchPlace(request).addOnSuccessListener((response) -> {
      Place place = response.getPlace();
      Log.i(TAG, "Place found: " + place.getName());
    }).addOnFailureListener((exception) -> {
        if (exception instanceof ApiException) {
            ApiException apiException = (ApiException) exception;
            int statusCode = apiException.getStatusCode();
            // Handle error with given status code.
            Log.e(TAG, "Place not found: " + exception.getMessage());
        }
    });
    

استرجاع صورة مكان

يمكنك استخدام fetchPhoto() للحصول على صورة مكان. يعرض fetchPhoto() صورًا لمكان معيّن. تم تبسيط نمط طلب الصورة. يمكنك الآن طلب PhotoMetadata مباشرةً من العنصر Place، ولم يعُد من الضروري تقديم طلب منفصل. يمكن أن يبلغ عرض الصور أو ارتفاعها 1600 بكسل كحد أقصى. fetchPhoto() بشكل مشابه لـ getPhoto().

اتبع الخطوات التالية لجلب صور الأماكن:

  1. يمكنك إعداد مكالمة مع fetchPlace(). تأكَّد من تضمين الحقل PHOTO_METADATAS في طلبك:

    List<Place.Field> fields = Arrays.asList(Place.Field.PHOTO_METADATAS);
    
  2. الحصول على كائن مكان (يستخدم هذا المثال fetchPlace()، ولكن يمكنك أيضًا استخدام findCurrentPlace()):

    FetchPlaceRequest placeRequest = FetchPlaceRequest.builder(placeId, fields).build();
    
  3. أضِف OnSuccessListener للحصول على البيانات الوصفية للصور من Place الناتج في FetchPlaceResponse، ثم استخدِم البيانات الوصفية للصور للحصول على صورة نقطية ونص إحالة:

    placesClient.fetchPlace(placeRequest).addOnSuccessListener((response) -> {
        Place place = response.getPlace();
    
        // Get the photo metadata.
        PhotoMetadata photoMetadata = place.getPhotoMetadatas().get(0);
    
        // Get the attribution text.
        String attributions = photoMetadata.getAttributions();
    
        // Create a FetchPhotoRequest.
        FetchPhotoRequest photoRequest = FetchPhotoRequest.builder(photoMetadata)
                .setMaxWidth(500) // Optional.
                .setMaxHeight(300) // Optional.
                .build();
        placesClient.fetchPhoto(photoRequest).addOnSuccessListener((fetchPhotoResponse) -> {
            Bitmap bitmap = fetchPhotoResponse.getBitmap();
            imageView.setImageBitmap(bitmap);
        }).addOnFailureListener((exception) -> {
            if (exception instanceof ApiException) {
                ApiException apiException = (ApiException) exception;
                int statusCode = apiException.getStatusCode();
                // Handle error with given status code.
                Log.e(TAG, "Place not found: " + exception.getMessage());
            }
        });
    });
    

العثور على مكان من الموقع الجغرافي للمستخدم

استخدِم findCurrentPlace() للعثور على الموقع الجغرافي الحالي لجهاز المستخدم. تعرض findCurrentPlace() قائمة من PlaceLikelihood تشير إلى الأماكن التي يُرجّح أن يكون موقع جهاز المستخدم فيها. تعمل findCurrentPlace() بشكل مشابه لـ getCurrentPlace().

اتّبِع الخطوات التالية لمعرفة الموقع الجغرافي الحالي لجهاز المستخدم:

  1. تأكَّد من أنّ تطبيقك يطلب الإذنَين ACCESS_FINE_LOCATION وACCESS_WIFI_STATE. يجب أن يمنح المستخدم الإذن بالوصول إلى الموقع الجغرافي الحالي لأجهزته. راجع طلب أذونات التطبيق للحصول على التفاصيل.

  2. يمكنك إنشاء FindCurrentPlaceRequest، بما في ذلك قائمة بأنواع بيانات الأماكن التي تريد عرضها.

      // Use fields to define the data types to return.
      List<Place.Field> placeFields = Arrays.asList(Place.Field.NAME);
    
      // Use the builder to create a FindCurrentPlaceRequest.
      FindCurrentPlaceRequest request =
              FindCurrentPlaceRequest.builder(placeFields).build();
    
  3. يمكنك الاتصال بالعثور على الموقع الحالي والتعامل مع الاستجابة، مع التحقّق أولاً للتأكّد من أنّ المستخدم قد منح الإذن باستخدام الموقع الجغرافي للجهاز.

      // Call findCurrentPlace and handle the response (first check that the user has granted permission).
      if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
          placesClient.findCurrentPlace(request).addOnSuccessListener(((response) -> {
              for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) {
                  Log.i(TAG, String.format("Place '%s' has likelihood: %f",
                          placeLikelihood.getPlace().getName(),
                          placeLikelihood.getLikelihood()));
                  textView.append(String.format("Place '%s' has likelihood: %f\n",
                          placeLikelihood.getPlace().getName(),
                          placeLikelihood.getLikelihood()));
              }
          })).addOnFailureListener((exception) -> {
              if (exception instanceof ApiException) {
                  ApiException apiException = (ApiException) exception;
                  Log.e(TAG, "Place not found: " + apiException.getStatusCode());
              }
          });
      } else {
          // A local method to request required permissions;
          // See https://developer.android.com/training/permissions/requesting
          getLocationPermission();
      }
    

العثور على عبارات بحث مقترحة للإكمال التلقائي

استخدِم findAutocompletePredictions() لعرض عبارات بحث مقترحة استجابةً لطلبات بحث المستخدم. تعمل findAutocompletePredictions() بشكل مشابه لـ getAutocompletePredictions().

يوضح المثال التالي حالة الاتصال بالرقم findAutocompletePredictions():

// Create a new token for the autocomplete session. Pass this to FindAutocompletePredictionsRequest,
// and once again when the user makes a selection (for example when calling fetchPlace()).
AutocompleteSessionToken token = AutocompleteSessionToken.newInstance();
// Create a RectangularBounds object.
RectangularBounds bounds = RectangularBounds.newInstance(
  new LatLng(-33.880490, 151.184363),
  new LatLng(-33.858754, 151.229596));
// Use the builder to create a FindAutocompletePredictionsRequest.
FindAutocompletePredictionsRequest request = FindAutocompletePredictionsRequest.builder()
// Call either setLocationBias() OR setLocationRestriction().
   .setLocationBias(bounds)
   //.setLocationRestriction(bounds)
   .setCountry("au")
   .setTypesFilter(Arrays.asList(PlaceTypes.ADDRESS))
   .setSessionToken(token)
   .setQuery(query)
   .build();

placesClient.findAutocompletePredictions(request).addOnSuccessListener((response) -> {
   for (AutocompletePrediction prediction : response.getAutocompletePredictions()) {
       Log.i(TAG, prediction.getPlaceId());
       Log.i(TAG, prediction.getPrimaryText(null).toString());
   }
}).addOnFailureListener((exception) -> {
   if (exception instanceof ApiException) {
       ApiException apiException = (ApiException) exception;
       Log.e(TAG, "Place not found: " + apiException.getStatusCode());
   }
});

الرموز المميزة للجلسة

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

أقنعة الحقل

في الطرق التي تعرض تفاصيل المكان، عليك تحديد أنواع بيانات الأماكن التي تريد عرضها مع كل طلب. يساعد هذا في ضمان أنك تطلب فقط (وتدفع مقابل) البيانات التي ستستخدمها بالفعل.

لتحديد أنواع البيانات المطلوب عرضها، مرِّر مصفوفة من Place.Field في FetchPlaceRequest على النحو الموضّح في المثال التالي:

// Include address, ID, and phone number.
List<Place.Field> placeFields = Arrays.asList(Place.Field.ADDRESS,
                                              Place.Field.ID,
                                              Place.Field.PHONE_NUMBER);

يمكنك استخدام حقل واحد أو أكثر من الحقول التالية:

  • Place.Field.ADDRESS
  • Place.Field.ID
  • Place.Field.LAT_LNG
  • Place.Field.NAME
  • Place.Field.OPENING_HOURS
  • Place.Field.PHONE_NUMBER
  • Place.Field.PHOTO_METADATAS
  • Place.Field.PLUS_CODE
  • Place.Field.PRICE_LEVEL
  • Place.Field.RATING
  • Place.Field.TYPES
  • Place.Field.USER_RATINGS_TOTAL
  • Place.Field.VIEWPORT
  • Place.Field.WEBSITE_URI

يمكنك الاطلاع على مزيد من المعلومات عن رموز التخزين التعريفية لبيانات الأماكن.

تحديثات "أداة اختيار الأماكن" و"الإكمال التلقائي"

يشرح هذا القسم التغييرات التي طرأت على أدوات الأماكن (منتقي الأماكن والإكمال التلقائي).

الإكمال التلقائي الآلي

تم إجراء التغييرات التالية على الإكمال التلقائي:

  • تمت إعادة تسمية "PlaceAutocomplete" إلى "Autocomplete".
    • تمت إعادة تسمية "PlaceAutocomplete.getPlace" إلى "Autocomplete.getPlaceFromIntent".
    • تمت إعادة تسمية "PlaceAutocomplete.getStatus" إلى "Autocomplete.getStatusFromIntent".
  • تمت إعادة تسمية PlaceAutocomplete.RESULT_ERROR إلى AutocompleteActivity.RESULT_ERROR (لم تتغير معالجة الخطأ لجزء الإكمال التلقائي).

منتقي الأماكن

تم إيقاف "أداة اختيار الأماكن" في 29 كانون الثاني (يناير) 2019. وتم إيقافها في 29 تموز (يوليو) 2019 ولم تعُد متوفّرة. سيؤدي استمرار الاستخدام إلى ظهور رسالة خطأ. لا تتيح حزمة تطوير البرامج (SDK) الجديدة استخدام "أداة اختيار الأماكن".

التطبيقات المصغّرة للإكمال التلقائي

تم تحديث أدوات الإكمال التلقائي:

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

توضح الأقسام التالية كيفية إضافة أداة إكمال تلقائي إلى مشروعك.

تضمين AutocompleteFragment

لإضافة جزء من الإكمال التلقائي، اتّبِع الخطوات التالية:

  1. أضِف جزءًا إلى تنسيق XML للنشاط، كما هو موضّح في المثال التالي.

    <fragment
      android:id="@+id/autocomplete_fragment"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:name=
    "com.google.android.libraries.places.widget.AutocompleteSupportFragment"
      />
    
  2. لإضافة أداة الإكمال التلقائي إلى النشاط، اتّبِع الخطوات التالية:

    • يمكنك إعداد Places، وتمرير سياق التطبيق ومفتاح واجهة برمجة التطبيقات.
    • إعداد AutocompleteSupportFragment.
    • يمكنك طلب setPlaceFields() للإشارة إلى أنواع بيانات الأماكن التي تريد الحصول عليها.
    • أضِف PlaceSelectionListener لاتخاذ إجراء بشأن النتيجة، بالإضافة إلى التعامل مع أي أخطاء قد تحدث.

    يعرض المثال التالي إضافة أداة إكمال تلقائي إلى نشاط:

    /**
     * Initialize Places. For simplicity, the API key is hard-coded. In a production
     * environment we recommend using a secure mechanism to manage API keys.
     */
    if (!Places.isInitialized()) {
        Places.initialize(getApplicationContext(), "YOUR_API_KEY");
    }
    
    // Initialize the AutocompleteSupportFragment.
    AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment)
            getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);
    
    autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME));
    
    autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {
            // TODO: Get info about the selected place.
            Log.i(TAG, "Place: " + place.getName() + ", " + place.getId());
        }
    
        @Override
        public void onError(Status status) {
            // TODO: Handle the error.
            Log.i(TAG, "An error occurred: " + status);
        }
    });
    

استخدام نية لبدء نشاط الإكمال التلقائي

  1. إعداد Places، وتمرير سياق التطبيق ومفتاح واجهة برمجة التطبيقات
  2. استخدِم Autocomplete.IntentBuilder لإنشاء هدف من خلال تمرير وضع PlaceAutocomplete المطلوب (ملء الشاشة أو المحتوى المركّب). ويجب أن يستدعي الغرض استدعاء startActivityForResult، مع إدخال رمز طلب يحدد نيتك.
  3. يمكنك إلغاء معاودة الاتصال بنظام "onActivityResult" للحصول على المكان المحدّد.

يوضح المثال التالي كيفية استخدام نية لبدء تشغيل الإكمال التلقائي، ثم التعامل مع النتيجة:

    /**
     * Initialize Places. For simplicity, the API key is hard-coded. In a production
     * environment we recommend using a secure mechanism to manage API keys.
     */
    if (!Places.isInitialized()) {
        Places.initialize(getApplicationContext(), "YOUR_API_KEY");
    }

    ...

    // Set the fields to specify which types of place data to return.
    List<Place.Field> fields = Arrays.asList(Place.Field.ID, Place.Field.NAME);

    // Start the autocomplete intent.
    Intent intent = new Autocomplete.IntentBuilder(
            AutocompleteActivityMode.FULLSCREEN, fields)
            .build(this);
    startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE);

    ...

    /**
     * Override the activity's onActivityResult(), check the request code, and
     * do something with the returned place data (in this example its place name and place ID).
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == AUTOCOMPLETE_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                Place place = Autocomplete.getPlaceFromIntent(data);
                Log.i(TAG, "Place: " + place.getName() + ", " + place.getId());
            } else if (resultCode == AutocompleteActivity.RESULT_ERROR) {
                // TODO: Handle the error.
                Status status = Autocomplete.getStatusFromIntent(data);
                Log.i(TAG, status.getStatusMessage());
            } else if (resultCode == RESULT_CANCELED) {
                // The user canceled the operation.
            }
        }
    }

لم تعد أداة اختيار الأماكن متاحة

تم إيقاف "أداة اختيار الأماكن" في 29 كانون الثاني (يناير) 2019. وتم إيقافها في 29 تموز (يوليو) 2019 ولم تعُد متوفّرة. سيؤدي استمرار الاستخدام إلى ظهور رسالة خطأ. لا تتيح حزمة تطوير البرامج (SDK) الجديدة استخدام "أداة اختيار الأماكن".