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

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

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

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

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

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

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

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

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

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

إيقاف مكتبة التوافق مع "الأماكن" نهائيًا

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

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

تثبيت مكتبة العميل

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

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

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

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

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

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

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

  2. إذا كنت تستخدم حاليًا إصدار "خدمات Play" من حزمة تطوير البرامج (SDK) لأماكن Google على Android:

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

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

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

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

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

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

  5. تعديل مواد العرض "بواسطة Google&quot:

    @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 لأماكن Google الجديدة

يمكنك إعداد برنامج SDK لأماكن Google الجديدة كما هو موضح في المثال التالي:

// 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. يتم الآن عرض أخطاء الحدّ الأقصى المسموح به (QPS) عبر PlaceStatusCodes.OVER_QUERY_LIMIT. لم يعد هناك المزيد من حدود QPD.

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

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

    • لم يتم تقديم مفتاح واجهة برمجة التطبيقات.
    • تم تقديم مفتاح واجهة برمجة تطبيقات غير صالح.
    • لم يتم تفعيل واجهة برمجة تطبيقات الأماكن في Cloud Console.
    • تم تقديم مفتاح واجهة برمجة التطبيقات مع قيود مفتاح غير صحيحة.
  • INVALID_REQUEST - الطلب غير صالح بسبب وسيطة مفقودة أو غير صالحة.

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

طرق جديدة

يقدم الإصدار الجديد من حزمة تطوير البرامج (SDK) لأماكن 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() قائمة PlaceLikelihoods التي تشير إلى أماكن يُرجح أن يكون جهاز المستخدم فيها. وتعمل 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. اتّصل بـCurrentCurrentPlace وأعِدّ الردّ، تحقّق أولاً من أنّ المستخدم قد وافق على استخدام الموقع الجغرافي لجهازه.

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