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

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

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

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

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

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

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

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

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

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

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

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

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

يتم توزيع الإصدار الجديد من حزمة تطوير البرامج (SDK) لتطبيق "الأماكن" على Android كمكتبة تطبيقات static.

استخدِم 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:3.3.0'

  2. إذا كنت تستخدم حاليًا إصدار "خدمات Play" من حزمة Places SDK لنظام التشغيل Android:

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

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

      باستخدام هذا السطر للتبديل إلى حزمة تطوير البرامج (SDK) لنظام التشغيل 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. أنشئ تطبيقك. إذا ظهرت لك أي أخطاء في عملية الإنشاء بسبب عملية التحويل إلى حزمة Places SDK لنظام التشغيل 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);

رموز الحالة

تم تغيير رمز الحالة لأخطاء الحد الأقصى لعدد طلبات البحث في الثانية. يتم الآن عرض أخطاء الحد الأقصى لعدد طلبات البحث في الثانية من خلال PlaceStatusCodes.OVER_QUERY_LIMIT. لم تعُد هناك حدود لعدد طلبات البحث في الثانية.

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

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

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

  • NOT_FOUND - لم يتم العثور على أي نتيجة للطلب المقدَّم.

طرق جديدة

يقدّم الإصدار الجديد من حزمة تطوير البرامج (SDK) لميزة "الأماكن" على Android methods جديدة تمامًا تم تصميمها لتحقيق الاتساق. تلتزم جميع الطرق الجديدة يلي:

  • لم تعُد نقاط النهاية تستخدم الفعل 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.DISPLAY_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.DISPLAY_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());
   }
});

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

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

أقنعة الحقول

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

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

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

للحصول على قائمة بالحقول التي يمكنك استخدامها في قناع حقل، اطّلِع على حقول بيانات الأماكن (جديد) .

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

تعديلات على أداة اختيار الأماكن وميزة "الإكمال التلقائي"

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

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

تم إجراء التغييرات التالية على ميزة autocomplete:

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