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

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

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

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

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

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

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

في كانون الثاني (يناير) 2019، مع إطلاق الإصدار 1.0 من حزمة "SDK للأماكن" المستقلة لنظام التشغيل 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 ستكون هي استخدام حزمة "SDK للأماكن" على نظام التشغيل Android.

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

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

يتم توزيع الإصدار الجديد من حزمة تطوير البرامج للأماكن (SDK) في الأماكن لنظام التشغيل Android كمكتبة عملاء ثابتة.

استخدم Maven لإضافة حزمة SDK للأماكن لنظام التشغيل 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. أنشئ تطبيقك. إذا لاحظت أي أخطاء في الإصدار بسبب تحويلك إلى حزمة "SDK للأماكن" لنظام التشغيل Android، يُرجى الاطّلاع على الأقسام أدناه للحصول على معلومات عن حلّ هذه الأخطاء.

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

قم بتهيئة عميل Places 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.
    • تم تقديم مفتاح واجهة برمجة تطبيقات يحتوي على قيود مفاتيح غير صحيحة.
  • 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. يمكنك استدعاء findCurrentPlace والتعامل مع الاستجابة، مع التحقق أولاً من أنّ المستخدم قد منح الإذن لاستخدام الموقع الجغرافي لجهازه.

      // 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) الجديدة مع "أداة اختيار الأماكن".